2009-08-15 67 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