コンパイラがどのように先を見据えるかに関する c++ の規則は明らかではありません (たとえばinstance
、メンバーがクラスの後半で定義されている場合でも、メソッドで使用することは問題ありませんが、同じソース ファイルで後で定義されているクラスを使用することは問題です)。 .
この場合の問題は、(他のレポートのように) コンパイル時new B
にコンパイラがクラスである以上のことを知っている必要があり、実際に何であるかを確認するB
ためにクラスを超えて読み続けないことです。A
B
考えられる解決策の 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
インスタンスも作成されます。A
A
B
これは、 のインスタンスを作成するには、 のインスタンスをA
間接的に作成する必要があることを意味しますA
。
ばかげているようですね。
このコードでのインスタンスA
(または のB
) をインスタンス化すると、無限の再帰が発生します (つまり、ほとんどの実装で異常なクラッシュが発生します)。