2011-01-16 13 views
5

これはうまくコンパイルされますが、私はまだ実行しようとは思わないでしょう。しかし...継承情報で前方に宣言する

//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原因のプログラムで行う必要があります同様のものがコンパイルエラーが存在するためにベースの定義と派生上記の他のクラスを動かします。

明白な解決策は、コードの先頭にコメントをコメントアウトして前方宣言することですが、これによりbase *とderived * errorの間で変換できません。継承情報を含めて宣言を転送しようとすると、どちらも動作しません。

答えて

9

これは動作するはずです。あなたは他の人に移動する必要があります

しかし、以下の機能を宣言してください。そうすれば、funcは、派生した型が基本型であることを「見る」ことができます。

例えば、フォワード宣言2つのクラスをし、一方が他方から継承することを指定するための構文は

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; } 
+0

優れています。これと実際の問題を抱えたプログラムでうまくいった。私はこれが良いのために問題の終わりになることを望んでいる。 – alan2here

4

はありません。これは、継承が複雑(複数および/または仮想)になる可能性があるため、base1 = derived1には算術演算が含まれている可能性があります。derivedbaseから継承していることを知っているときにコンパイラが算術演算を生成することは困難です。

だから、あなたの問題を解決するために、あなたはreinterpret_castを、funcあなたは絶対にそれをインラインする必要がある場合は、インライン(AbstractDissonanceからの回答を参照)、またはないmakeを使うことができます。

class base; 
class derived; 

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

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

+1

これを念頭に置いておきますが、もう一方のソリューションを使用してください。知っておくと便利です。私は、reinterpret_castがこのように使用できることを認識していませんでした。 – alan2here

関連する問題