1

誰かがすでにこれを尋ねているかどうかはわかりませんが、ここで奇妙な動作が見られます:

2つのクラスを宣言しました。1つはベースで、もう1つは1つの仮想メソッドで派生したものdisplay()です。

class A {
public:
    virtual void display() {
        cout << "base class" << endl;
    }
};

class B:public A {
public:
    void display() {
        cout << "derived class" << endl;
    }
};

さて、で、のmain()を宣言して新しいインスタンスを割り当てようとすると、auto_ptrAB

int main() {
    auto_ptr<A> *a = (auto_ptr<A>*)new B();
    a->display();
}

コンパイル時にこのエラーが発生します:

'class std::auto_ptr<A>''display'という名前のメンバーはありません」

私は何か間違ったことをしていますか?誰かがその行動を説明できますか?

4

3 に答える 3

3

へのポインタを作成していますauto_ptr。Anauto_ptrはポインタのように機能するオブジェクトであるため、を追加する必要はありません*

あなたはおそらく欲しい:

auto_ptr<A> a(new B());
a->display();

Boostのスマートポインタ(scoped_ptrおよびshared_ptr)またはC++11のstd::unique_ptrおよびのいずれかを推奨する必要がありますがstd::shared_ptr

于 2012-05-15T09:32:28.540 に答える
2
auto_ptr<A> *a = (auto_ptr<A>*)new B();

それは非常に奇妙なことをしています。オブジェクトを作成し、スマートポインターを使用してそれを管理する場合は、オブジェクトへのポインターを使用してスマートポインターを初期化します。

auto_ptr<A> a(new B);
a->display();
于 2012-05-15T09:32:37.137 に答える
2

なぜ書いたのauto_ptr<A> *a?そんなことはないはずです。したがって、このエラーが発生します。する必要がありますauto_ptr<A> a(new B);。それがどのように機能するかをここで読んでください。

于 2012-05-15T09:33:10.097 に答える