从文件加载不同的对象

时间:2013-10-07 07:17:12

标签: c++ pointers inheritance declaration

我正在尝试从文件中加载看起来像

的A和B对象
A 3 4
B 2 4 5
B 3 5 6
A 2 3

我有以下类,Base,A和B,Base的子类。每个都与运营商>>超载。

问题出在函数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;
}

2 个答案:

答案 0 :(得分:0)

您必须在使用它的范围内声明pO

        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);

答案 1 :(得分:0)

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

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

因此,另一种解决方案是不使用指针。将obj数组Base而不是Base*数组,并避免使用newdelete

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

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类来导致任何对象切片!