我在将类作为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放置在命名空间中来使其正常工作,但是我也读到这是非常糟糕的做法,所以我真的不想那样做。

最佳答案

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

关于c++ - 在类中声明类的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14103304/

10-09 02:48