6

これは正常にコンパイルされますが、まだ実行してみたくありません。でも ...

//class base;
//class derived;
//class derived : public base;

class base {};
class derived : public base {};

class other
{
    public:
        void func() {base1 = derived1;}
        base* base1;
        derived* derived1;
};

void main()
{
}

... myneのプログラムで実行しなければならない同様のことがあるベースと派生の定義の上に他のクラスを移動すると、コンパイルエラーが発生します。

明らかな解決策は、コードの先頭にコメントアウトされたベースと派生を前方宣言することですが、これにより、ベース*と派生*の間で変換できないエラーが発生します。継承情報を含めて前方宣言を試みても機能しません。

4

2 に答える 2

9

これは機能するはずです。あなたは他を上に移動する必要があります

しかし、以下でfuncを宣言してください。このようにして、funcは派生したタイプがベースであることを「見る」ことができます。

例えば、

class base;
class derived;
//class derived : public base;

class other
{
    public:
        void func();
        base* base1;
        derived* derived1;
};

class base {};
class derived : public base {};

void other::func() { base1 = derived1; }
于 2011-01-16T20:26:55.827 に答える
4

2つのクラスを前方宣言し、一方が他方から継承することを指定するための構文はありません。これは、継承が複雑(複数および/または仮想)である可能性があるため、割り当てに何らかの演算が含まれる可能性があり、コンパイラがからの継承base1 = derived1のみを知っている場合にその演算を生成することは困難/不可能であるためです。derivedbase

したがって、問題を解決するには、インライン化しないようにするか( AbstractDissonancefuncの回答を参照)、どうしてもインライン化する必要がある場合は、次を使用します。reinterpret_cast

class base;
class derived;

class other
{
    public:
        void func() {base1 = reinterpret_cast<base*>(derived1);}
        base* base1;
        derived* derived1;
};

これは、C ++標準での動作が保証されていないため悪いことであり、複数/仮想継承を使用する場合はほぼ確実に動作しません。これはfunc、できるだけ高速である必要がある場合(つまり、インライン)であり、コードを移植可能にする必要がない場合にのみ使用してください。

于 2011-01-16T20:38:49.180 に答える