0

我正在尝试从看起来像的文件中加载 A 和 B 对象

A 3 4
B 2 4 5
B 3 5 6
A 2 3

我有以下类,Base,A 和 B,Base 的子类。每个都带有 operator>> 重载。

问题出在函数 load() 中。我不确定如何实例化对象。我的 load() 无法编译,因为‘pO’ was not declared in this scope. 我该如何解决?或者实现这一目标的最佳方法是什么?

另外,如果我设法让它以某种方式工作,我需要手动删除对象吗?

class Base
{
    public:
        Base() {}
        Base(int tot_) : tot(tot_) {}

        void print() const {
            std::cout << "Tot : " << tot << std::endl; 
        }

    private:
        int tot;
};

class A : public Base
{
    public:
        A() : Base(0) {}
        A(int a1, int a2) : Base(a1+a2) {}
};


class B : public Base
{
    public:
        B() : Base(1) {}
        B(int b1, int b2, int b3) : Base(b1+b2+b3){}
};

std::istream& operator>>(std::istream& in, A& a)
{ 
    int a1, a2;
    in >> a1; 
    in >> a2;

    a = A(a1,a2);

    return in;
}

std::istream& operator>>(std::istream& in, B& b)
{ 
    int b1, b2, b3;
    in >> b1; 
    in >> b2;
    in >> b3;

    b = B(b1,b2,b3);

    return in;
}

bool load(const std::string& s, std::vector<Base*>& objs)
{
    std::ifstream is(s.c_str());
    if (is.good())
    {
        std::string obj;
        while (!is.eof()) 
        {
            is >> obj;
            if (obj == "A") {
                A *pO = new A;
            }
            else (obj == "B") {
                B *pO = new B;
            }
            is >> *pO;
            objs.push_back(pO);
        }
        is.close();
        return true;
    }
    return false;
}
4

2 回答 2

0

You have to declare pO in the scope where you use it:

        is >> obj;
        Base *pO;
        if (obj == "A") {
            A *a = new A;
            is >> *a;
            pO = a;
        }
        else { // (obj == "B")
            B *b = new B;
            is >> *b;
            pO = b;
        }
        objs.push_back(pO);
于 2013-10-07T07:22:48.200 回答
0

您的另一个问题“我需要手动删除对象”的答案是肯定的,分配的对象new总是需要删除delete

但是,由于您将指针推送到数组,因此请确保在它们仍在使用时不要过早删除它们!

因此,一种替代解决方案是不使用指针。制作obj一个数组Base而不是数组,Base*并避免任何newor delete

编辑:
没有指针,我会写这样的东西:

while (!is.eof()) {
    is >> obj;
    if (obj == "A") {
        A pO; 
        is >> pO;
        objs.push_back(pO);
    }
    else if (obj == "B") {
        B pO;
        is >> pO;
        objs.push_back(pO);
    }
}

但请确保不要通过向 A 类或 B 类添加成员变量来导致任何对象切片!

于 2013-10-07T07:35:09.427 回答