0

我在编写一个作为 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);
};

我假设这与它们都链接到同一个头文件有关,但我一直在寻找广泛的方法,试图在网上找到解决方案,但无济于事。我确实设法通过将包含放在命名空间中来使其工作,但我也读到这是非常糟糕的做法,所以我真的不想那样做。

4

2 回答 2

3
FirstClass(ThirdClass ());

这应该做什么?

如果ThirdClass已经声明了类型,那么它声明了一个以函数地址作为参数的构造函数,这不是你想要的,对吧? ThirdClass ()是不带参数并返回 a 的函数的类型ThirdClass,因此您的构造函数参数是该类型的函数(地址)。

如果ThirdClass 尚未声明(并且您得到的错误暗示尚未声明),则它相当于:

FirstClass ThirdClass();

即调用的(非构造函数)函数ThirdClass返回一个FirstClass对象。

您可能希望它是一个以ThirdClass对象为参数的构造函数,即:

FirstClass(ThirdClass);

或者为了避免复制参数(这通常是你想要的):

FirstClass(const ThirdClass&);

对于您的Init功能也是如此。

ThirdClass不是类型名称的错误表明该类型尚未声明。我们只能猜测,因为您没有显示完整的、独立的示例(没有 cookie),但您#include "FirstClass.h"ThirdClass.h标题中可能有,这会导致循环引用,并且只有一个文件被正确处理。

有关更多信息,请参阅这些问题(及其答案):
头文件之间的循环依赖
C++ 循环头依赖
C++ 错误:'Line2' 尚未声明

于 2012-12-31T16:04:23.987 回答
2

我猜,你的构造函数Init()应该是

FirstClass(const ThirdClass &rhs);
...
void Init (const ThirdClass &rhs);

此外,您应该考虑添加include guards

于 2012-12-31T15:30:19.403 回答