2011-09-09 16 views
1

C++でビルド順序の依存関係に何かが誤解されているようです。私は「使用文句コンパイラエラーを取得していますC++ - ビルド順序と依存関係の問題

#include "Imports.h" 

class X: public Y 
{ 
public: 

    X (T* t) { this->t= t; } 
    virtual ~X(){} 

    virtual void draw() 
    { 
     if (t->booleanReturningFunction()) 
     { 
       t->someField.draw(); 
     } 
    } 

    T* t; 
}; 

:だから私は、私はfunctionoid(その目的関数ポインタを渡すために置換することであるオブジェクト)として使用するクラスを定義し、このコードを、持っていますそのクラスの定義を含む.H」ファイル:未定義の型Tの「それぞれに

//The goal of this file is to have all the typcally needed imports in one place. 

#if !defined(IMPORTS_H) 
#define IMPORTS_H 

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <iostream> 
#include <assert.h> 
#include <cmath> 
#include <fstream> 

class T; 
class X; 
class Y; 

#include "Y.h" 
#include "X.h" 
#include "T.h" 

#endif // if !defined(IMPORTS_H) 

私はT.を使用している行番号でしかし、Imports.hは次のようになります」。現在、Tには実際にはXオブジェクト(ポインタではなくXオブジェクト)があります。しかし、私が知る限り、XにはTへのポインタしかないので、ビルド順に循環依存はありません。このコードからちょうど見ることができないものがありますか?助けが大いにありがとう!

編集:私は私の問題を解決しました。問題は、私がヘッダファイルの中で上記のコードを実行していたことでした。コンパイラは順方向参照に基づいてt-> booleanReturningFunction()をコンパイルすることができませんでした(関数呼び出しをバインドするアドレスを知るためにはクラス宣言が必要でした)。

+0

一般に、クラスのすべてのインクルードを1か所にまとめたくない場合は、それはあなたのプロジェクトを非常に扱いにくいものにします。 –

+0

私はそれを理解していますが、これはこのプロジェクトがすでにどのように行われているかであり、絶対に必要な場合を除き、現時点でそれを再加工する気がしません。私は離れて行かなければならない特定のエラーがほしいだけです。 – Gravity

答えて

0

私は私の問題を解決しました。問題は、私がヘッダファイルの中で上記のコードを実行していたことでした。コンパイラは順方向参照に基づいてt-> booleanReturningFunction()をコンパイルすることができませんでした(関数呼び出しをバインドするアドレスを知るためにはクラス宣言が必要でした)。

1

Tには実際にはXオブジェクト(ポインタではなくXオブジェクト)があります。この順番を考える

- あなたが述べたように

class T; 
class X; 
class Y; 

#include "Y.h" 
#include "T.h" // 1 
#include "X.h" 

T.hXを目的としています。これまでの時点(1)のコンパイラは、クラスXの定義を知らない。オブジェクトのコンパイラをインスタンス化するには、前方宣言でない完全なクラス定義が表示されます(X)。コンパイラが未定義の型Tについて不平を言っているのは奇妙に思えます。

+0

申し訳ありませんが、私は間違っています。それは '' Y.h ''、' 'X.h''、 '' T.h ''のみです。私は自分の投稿を編集しました。だからこそ私が持っているビルドオーダーの問題は、私には分かりません。 'X'インスタンスが' T'インスタンス上のメソッドを呼び出しているか(上記の私のコードで示されているように)、あるいは何らかの形で関連するそのようなインスタンスのフィールドを使用していますか? – Gravity

+0

Nevermind。私は私の問題を解決しました。問題は、私がヘッダファイルの中で上記のコードを実行していたことでした。コンパイラは順方向参照に基づいて 't-> booleanReturningFunction()'をコンパイルできませんでした(関数呼び出しをバインドするアドレスを知るためにはクラス宣言が必要でした)。 – Gravity

+0

@Gravityは回答としてコメントを再投稿し、それを受け入れる –