我在编写类作为C ++程序的一部分时遇到了问题 - 在其中我有三个类,FirstClass,SecondClass和ThirdClass - First和Second类都包含ThirdClass.h,在SecondClass中我可以声明它们但是,通常,在FirstClass中,第一个声明工作正常,但任何进一步的声明都会给我一个“ThirdClass不是类型名称”的错误
这是一个错误的类的片段
#include "ThirdClass.h"
class FirstClass
{
public:
FirstClass(void);
// This decleration of ThirdClass works fine
FirstClass(ThirdClass ());
FirstClass(const FirstClass& rhs);
~FirstClass(void);
private:
//These are the two that're erroring
ThirdClass nestedClass();
void Init (ThirdClass ());
void Copy (FirstClass);
};
我认为这与它们两个链接到相同的头文件有关,但我一直在寻找在线寻找解决方案无所作为。 我确实设法通过将include放在命名空间中来实现它,但我也读到这是非常糟糕的练习所以我真的不想这样做。
答案 0 :(得分:3)
FirstClass(ThirdClass ());
这应该做什么?
如果声明了类型ThirdClass
,那么它会声明一个构造函数,它将函数的地址作为参数,这不是你想要的,对吧? ThirdClass ()
是不带参数并返回ThirdClass
的函数的类型,因此构造函数参数是该类型函数的(地址)。
如果ThirdClass
未声明(并且您收到的错误暗示它尚未声明),那么它等同于:
FirstClass ThirdClass();
即。一个名为ThirdClass
的(非构造函数)函数,它返回一个FirstClass
对象。
您可能希望它是一个以ThirdClass
对象作为参数的构造函数,它将是:
FirstClass(ThirdClass);
或者避免复制参数(通常是你想要的):
FirstClass(const ThirdClass&);
同样适用于Init
功能。
说ThirdClass
的错误不是类型名称,表示尚未声明类型。我们只能猜测,因为你没有显示一个完整的,自包含的示例(没有cookie给你),但你的#include "FirstClass.h"
标题中可能有ThirdClass.h
,导致循环引用,只有一个文件处理正确。
更多信息,请参阅这些问题(及其答案):
cyclic dependency between header files
C++ cyclical header dependency
C++ error: 'Line2' has not been declared
答案 1 :(得分:2)
我想,你的构造函数和Init()
应该是
FirstClass(const ThirdClass &rhs);
...
void Init (const ThirdClass &rhs);
此外,您应该考虑添加include guards。