1

Base* base次のクラスのプログラムで、 ?Containerに置き換えることができるかどうか知りたいです。抽象的であるため、置き換える ことはできません。 オブジェクトをどこかに割り当てる必要があるので、割り当てられたオブジェクトへのポインタを取り除くことはできません。 Base& base
Base baseBase
Base& base

#include <iostream>
class Base
{   public:
    virtual void str()=0;
};

class A : public Base
{   int i;
    public:
    A(int i):i(i){}
    void str(){std::cout<<i<<std::endl;}
};

class B : public Base
{   double f;
    public:
    B(double f):f(f){}
    void str(){std::cout<<f<<std::endl;}
};

class Container
{   Base *base;
    public:
    Container(int i)   { base=new A(i);}
    Container(double f) { base=new B(f);}
    void str(){ base->str();}
};
int main ()
{   
    Container c1(8),c2(13.0);  
    c1.str();   
    c2.str();  
    return 0;  
}
4

1 に答える 1

4

あなたのコードでは、私はそれをお勧めしません。なぜならContainer、の所有者でbaseあり、参照は、意味的に、他の何か(エイリアス)を意味するからです。

技術的には、あなたを止めるものは何もありません。

class Container
{   Base &base;
    public:
    Container(int i) : base(*new A(i))   {}
    Container(double f) : base(*new B(f)) {}
    void str(){ base->str();}
};

参照は初期化子リストで初期化する必要があることに注意してください。

それでもメモリをクリーンアップする必要があり、参照すると見苦しくなります。

~Container() { delete &base; }

それ以外の

~Container() { delete base; }

ポインタを使用した場合。もちろん、std::unique_ptrこれら2つのいずれかの代わりに使用すると、生活がずっと楽になります。

また、必ずコピーコンストラクタまたは代入演算子を実装(またはとして宣言)してprivateください。deleted

後のスポット-デストラクタを提供する必要があります。そうしないと、メモリをクリーンアップしようとしたときに未定義の動作領域に遭遇します。Basevirtual

于 2012-08-30T14:39:44.940 に答える