2012-04-01 11 views
0

私は、囲むクラスから関数を呼び出す必要があるインスタンス化されたクラスがある状況があります。最上位クラスは生成されたコードであり、最下位クラスの後にコンパイルされます。その結果、トップクラスの名前はボトムクラスには知られていません。構造体を囲むメンバー関数を呼び出す

class topClass 
{ 
    public: 
    void topFunction(); 
    bottomCLass * bcInst; 
} 

class bottomClass 
{ 
    void * owner; 
    void someFunction() {owner->topFunction(); } 
} 

明らかに、topClassの定義がないため、これは機能しません。 topClass関数をbottomClass関数から呼び出せるように、これをどのように配置できますか?純粋な仮想関数で親クラスを使用しようとしましたが、関数が呼び出されるとクラッシュします。

//This is defined and compiled with bottomClass 
class classTemplate 
{ 
    public: 
    virtual void topFunction()=0; 
} 

class topClass : public classTemplate 
{ 
    public: 
    void topFunction(); 
    bottomClass * bcInst; 
} 

class bottomClass 
{ 
    classTemplate * owner; 
    void someFunction() {owner->topFunction();//Crashes here } 
} 

この問題を解決する方法がありますか?私ができないことの1つは、トップクラスの名前/定義をボトムクラスに与えることですが、topFunctionの存在と名前は保証されています。

+0

このリンクを見てくださいhttp://www.parashift.com/c++-faq/strange-inheritance.html#faq-23.4ここで彼は仮想機能について語り、そのように定義する方法は、ベースクラスが派生バージョンを呼び出します。これがあなたの望むものなのかどうかは確かではありません。 – chikuba

+0

また、「クラッシュ」という意味ですか?私たちが話しているクラッシュの種類を指定してください...あなたが投稿したコードは有効でなければなりません(いくつかの小さな問題を含む)ので、より多くのコードまたはより多くのクラッシュレポートを与えることができます – chikuba

答えて

3

someFunction()の実装をCPPに移動し、両方のヘッダーを含めます。

topClass.h:

#ifndef TOPCLASS_H 
#define TOPCLASS_H 
#include "bottomClass.h" 
class topClass 
{ 
    public: 
    void topFunction(); 
    bottomCLass * bcInst; 
} 
#endif 

bottomClass.h:

#ifndef BOTTOMCLASS_H 
#define BOTTOMCLASS_H 
class bottomClass 
{ 
    void * owner; 
    void someFunction(); 
} 
#endif 

classes.cpp:

#include "topClass.h" 
#include "bottomClass.h" 

void bottomClass::someFunction() {owner->topFunction(); }`enter code here` 
+0

そしてもちろんどこか 'void topClass :: topFunction {...} ' – Shahbaz

+0

@Shahbaz:OPはクラス宣言の中でtopFunctionを実装していないので、彼はすでにこれを行ったと思います:) – iehrlich

+0

別のコンパイル単位でbottomClass :: someFunctionだけをコンパイルできると言っています。 topClassとそのメンバーの定義を含むもの。 –

0

あなたはbottomテンプレートを作ることができるそれはあなたに大いに役立つでしょう:

struct topclass 
{ 
    void topfunction(); 
    bottom<topclass> * bcInst; 
    // ... 
}; 

template <typename T> 
struct bottom 
{ 
    T * p; 
    void somefunction() { p->topfunction(); } 
}; 

適切かどうかは、適切なテンプレート定義が適切な場所に表示されているかどうか、コードの重複が必要かどうかによって異なります。何らかの種類のタイプ消去方式で、固定された単一の「ボトム」クラスの中で、bottomテンプレートを小さなコンポーネントにすることができます。

+0

それは恐ろしいです... – iehrlich

+0

私はなぜあなたがテンプレートでとてもシンプルなことをしようとしているのか分かりません! – Shahbaz

+0

@Shahbazかもしれないので可能でしょうか? :) – iehrlich

関連する問題