2011-09-09 67 views
1

我似乎誤解了與在C++中構建順序依賴關係有關的東西。所以我有這樣的代碼,它定義了我作爲一個functionoid(對象,其目的是爲了替代傳遞一個函數指針)使用類: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; 
}; 

我收到抱怨的「使用編譯器錯誤未定義類型T的「在這裏我使用T.然而,行號,Imports.h樣子:

//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) 

,每個」包含類的定義.H」文件。現在T實際上有一個X對象(不是指針,而是X對象)。但是,據我所知,構建順序中沒有循環依賴關係,因爲X只有一個指向T的指針,對吧?有什麼我錯過了,你可以從這個代碼中看到嗎?非常感謝幫助!

編輯:我解決了我的問題。問題是我在一個頭文件中做了上面的代碼。編譯器可以理解,無法根據前向引用編譯t-> booleanReturningFunction()(它需要查看類聲明以知道綁定函數調用的地址)。

+0

一般來說,你不希望你所有的課程包含在一個地方。它會讓你的項目非常難以管理。 –

+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.h有你提到一個X對象。在此之前(1)編譯器不知道類X的定義。對於實例化編譯器的對象,應該看到完整的類定義而不是X的前向聲明。但編譯器抱怨undefined類型T似乎很奇怪。

+0

對不起,我弄錯了。它是'「Y.h」','「X.h」',然後只有'「T.h」'。我編輯了我的帖子。這就是爲什麼我遇到的構建順序問題對我沒有多大意義。事實是'X'實例正在調用'T'實例上的一個方法(如我上面的代碼所示),或者使用這種實例的一個字段(通過指針)以任何方式相關? – Gravity

+0

沒關係。我解決了我的問題。問題是我在一個頭文件中做了上面的代碼。編譯器可以理解,不能編譯基於前向引用的't-> booleanReturningFunction()'(它需要查看類聲明以知道綁定函數調用的地址)。 – Gravity

+0

@Gravity轉發評論作爲迴應並接受它 –