2016-04-07 2 views
1

私は、相互接続の理由から、相互にポインタを含む一連のクラスをC++で用意しています。コードは以下の通りである:お互いのポインタを含むクラスを定義する

class Cell; 

//classes 
class Connection { 
public: 
    Cell * source; 

    virtual bool trigger() { 
     return source->trigger(); //line 16, source of the error 
    } 

    //constructors 
    //default 
    Connection() { 
     source = NULL; 
    } 

    //call 
    Connection(Cell * in) { 
     source = in; 
    } 

    //copy 
    Connection(const Connection & in) { 
     source = in.source; 
    } 
}; 

class NotConnection : Connection { 
public: 
    virtual bool trigger() override { 
     return !source->trigger(); 
    } 

    //constructors 
    //default 
    NotConnection() { 
     source = NULL; 
    } 

    //call 
    NotConnection(Cell * in) { 
     source = in; 
    } 

    //copy 
    NotConnection(const NotConnection & in) { 
     source = in.source; 
    } 
}; 


class Cell { 
public: 
    vector<Connection *> parents; 

    virtual bool trigger() = 0; 

    ~Cell() { 
     for (int i = 0; i < parents.size(); i++) { 
      delete parents[i]; 
     } 
    } 
}; 

私は任意のコンパイルの問題をクリアするための宣言を前方に使うことができると思ったが、私は、私はエラーを取得するプロジェクトをビルドしようとすると:

source.cpp(16): error C2027: use of undefined type 'Cell' 

私は再てみましたクラスを注文し、代わりにConnectionを宣言すると、どちらも動作しませんでしたが、私の質問はなぜコンパイラがこのエラーを投げているのか、それを解決するために何ができるのでしょうか?

+0

um ...どの行が16行ですか? – Brian

+0

どのラインが16であるかを示すコメントを追加しました – Stephen

答えて

1

まだ定義されていないクラスのメンバーにアクセスすることはできません。これは、コンパイラがクラスのメンバーのセットをまだ認識していないためです。

最初にtriggerを宣言してから、Cellの定義が見えてから定義してください。

class Cell; 

class Connection { 
public: 
    Cell * source;  
    virtual bool trigger(); 
}; 

class Cell { 
    // definition of Cell 
}; 

inline bool Connection::trigger() { 
    return source->trigger(); 
} 
+0

すべてのクラスをプロトタイプとして最初に定義し、その後このエラーを避けるために実装を記述するのは良いエチケットと考えられますか? – Stephen

0

ポインタまたはその参照を宣言するときに前方宣言されたクラスを使用できますが、実際にはそれらの型を使用することはできません。

connection::trigger()の実装を.cppファイルに移動するか、またはcellクラスの定義の後にinlineと定義します。

関連する問題