将类声明为类的一部分的问题

时间:2012-12-31 15:22:17

标签: c++ class header include declaration

我在编写类作为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放在命名空间中来实现它,但我也读到这是非常糟糕的练习所以我真的不想这样做。

2 个答案:

答案 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