0

次の各ステートメントには、対応するヘッダー ファイルの周りにガードが含まれています。

C は B を拡張し、B をサブクラス化して A へのポインタを取得できるようにしますが、A には B のサブクラスであるいくつかのフィールドがあります。

私の現在の解決策は、B を void 配列に格納し、実行時の型情報に基づいて正しいオブジェクトを返すテンプレート メソッドを使用することです。しかし、C が A, Ahead Of Time(Compile time)にリンクする必要がある場合でも、A が C フィールドを持つ方法があるかどうかを知りたいです。

オブジェクト指向プログラミングのコースをいくつか受講しましたが (ほとんどが Java でした)、特に C++ に焦点を当てたコースはありませんでした。

これはおそらく一般的な問題であり、この質問はおそらく既にここで尋ねられ、回答されていますが、そのような解決策を見つけるためにどのキーワードを使用すればよいかわかりません.

ああ

//#include "C.h" //would cause cyclical include
class A {
public:
    A();
    virtual ~A();

    /**Type must be checked at runtime, because otherwise cyclical includes occur*/
    template <class T> T* getComponent();
private:
    //C* aComponent; //desired implementation
    //Current implementation
    void* components;
    unsigned char componentCount;

};

Bh

#include "A.h"
class B {
public:
    B();
    virtual ~B();
    A* getRoot();

private:
    A* aRoot;
};

チャンネル

#include "B.h"
class C : B {
public:
    B();
    virtual ~B();
};

私が使用した他の OOP 言語は、そのような問題を舞台裏で解決するだけで、C++ ではビルド順序が正しい必要があります。この質問と漠然と似ている他の質問への回答をいくつか見ましたが、それらはちょっと不明確でした。回答を簡潔にしてください。

4

1 に答える 1

1

前方宣言を使用するだけです:

class C;

これを先頭に配置A.hすると、void ポインターを使用する代わりに、クラスを型として使用できます。

編集:明確にするために、これは単に という名前のクラスがあることをコンパイラに通知するだけですが、そのC定義はありません。それへのポインターを宣言することはできますが、コンパイラーがその実際の定義を確認するまで、そのメンバーを使用することはできません (これは問題にはなりません)。

于 2013-07-12T21:15:49.207 に答える