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

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);
于 2013-10-07T07:22:48.200 に答える
0

そして、「オブジェクトを手動で削除する必要がありますか」という他の質問への答えは「はい」です。で割り当てられたオブジェクトはnew常にで削除する必要がありますdelete

ただし、ポインターを配列にプッシュするため、ポインターがまだ使用されているときに削除しすぎないように注意してください。

したがって、別の解決策の 1 つは、ポインターを使用しないことです。の配列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 に追加して、オブジェクトのスライスが発生しないようにしてください。

于 2013-10-07T07:35:09.427 に答える