コンパイラがどのように先を見据えるかに関する c++ の規則は明らかではありません (たとえばinstance、メンバーがクラスの後半で定義されている場合でも、メソッドで使用することは問題ありませんが、同じソース ファイルで後で定義されているクラスを使用することは問題です)。 .
この場合の問題は、(他のレポートのように) コンパイル時new Bにコンパイラがクラスである以上のことを知っている必要があり、実際に何であるかを確認するBためにクラスを超えて読み続けないことです。AB
考えられる解決策の 1 つは、コンストラクターとデストラクターの定義をA後で配置することです (インラインのままにしておきます)。
class B;
class A
{
public:
A();
virtual ~A();
private:
A *instance;
};
class B : public A
{
public:
B() {}
};
inline A::A() { instance = new B; }
inline A::~A() { delete instance; }
これはコンパイルされますが、実際にここでやろうとしていることはかなり混乱しているため、正しく実行されません。
のインスタンスを作成するには、Aのインスタンスを作成しますがB、これBは の特殊化であるAため、 のインスタンスを作成すると、 ( の基本サブオブジェクト)のBインスタンスも作成されます。AA B
これは、 のインスタンスを作成するには、 のインスタンスをA間接的に作成する必要があることを意味しますA。
ばかげているようですね。
このコードでのインスタンスA(または のB) をインスタンス化すると、無限の再帰が発生します (つまり、ほとんどの実装で異常なクラッシュが発生します)。