2009-08-15 21 views
1

定義爲:Class.h全球結構沒有被人看見

#ifndef CLASS_H_ 
#define CLASS_H_ 

#include "Class2.h"  
#include <iostream> 

struct Struct1{ 
}; 

struct Struct2{ 
}; 

class Class1 { 
}; 

#endif 

那麼其他的頭文件,在這裏我用這個:

#ifndef CLASS2_H_ 
#define CLASS2_H_ 

#include "Class.h" 

class Class2 { 
    public: 
     Class2(Struct1* theStruct, Struct2* theStruct2); //Can't find struct definitions 
    private: 
}; 

#endif 

這些都是在同一個目錄。它沒有看到這些結構體定義!他們看起來在全球範圍內對我而言。有人可以向我解釋爲什麼Class2不能看到他們嗎?編譯器不抱怨沒有找到Class的頭部,所以它不能這樣做。

+0

這似乎並不是整個代碼。你有沒有試過這個確切的代碼? ''在哪裏使用? – 2009-08-15 16:16:28

+0

將這些更改爲指針。 – Alex 2009-08-15 16:37:46

+0

整個代碼現在包含在內 – Alex 2009-08-15 16:54:54

回答

4

接下來是猜測你的完整代碼。請張貼,然後我們可以幫助你更好。


如果您完整代碼看起來像那麼下面的任何機會,你應該改變它

#ifndef CLASS_H_ 
#define CLASS_H_ 

#include <iostream> 
#include "Class2.h" 

struct Struct1{ 
}; 

struct Struct2{ 
}; 

class Class1 { 
}; 

#endif 

因爲CLASS_H_宏將已經被定義,在Class2.h另一頭也不會包括另一次,然後在那個時候Struct1Struct2還不知道。儘可能使用前向聲明來修復它。例如,在Class2.h

#ifndef CLASS2_H_ 
#define CLASS2_H_ 

// no need for that file 
// #include "Class.h" 

// forward-declarations suffice  
struct Struct1; 
struct Struct2; 

class Class2 { 
    public: 
     Class2(Struct1 theStruct, Struct2 theStruct2); 
    private: 
}; 

#endif 

如果另一頭不需要的Class2定義要麼,然後使用前向聲明也有。是不是需要(即聲明就足夠了)

  • 引用和指針
  • 功能參數的函數聲明不屬於定義

如果您要訪問的成員需要它的定義,想要獲得sizeof或想要定義一個參數類型爲Class2,Struct1等的函數。

+0

您先生,都是通靈。那麼問題是,如果我想在Class中存儲Class2,我將如何在頭文件中引用它? – Alex 2009-08-15 16:46:24

+0

你將需要包含頭然後:)但是,然後,你將不得不設法不需要從其他頭的頭然後打破圓:)如果它不能打破,你將不得不使用一個指針和用'new'在.cpp文件中分配對象。試用'shared_ptr' :) – 2009-08-15 17:34:53