我有一个叫做Token 的父类。

我有两个子类,ErrorToken和EndToken 这些类中的每个类都必须能够创建另一个的对象,并通过函数调用将其返回。每个人都有自己的单独的 header 类。

因此,ErrorToken需要能够创建一个新的EndToken对象并返回它,EndToken需要能够创建一个新的ErrorToken对象并返回它。

成功做到这一点的最佳方法是什么?我希望它尽可能与交叉编译器兼容,所以我不想一次使用编译指示。 (但本质上就是我要找的东西)。

理想情况下,我希望能够做这样的事情...

#ifndef ErrorToken
#include "ErrorToken.h"
#endif

但这似乎从未奏效(我猜这是错误的吗?有人可以帮助我理解原因吗?)。

我对前向声明的理解是,它仅适用于函数签名和指针(是正确的吗?),所以我认为这不适用于我的情况,因为我需要它能够运行构造函数...或者编译器只需要知道构造函数会在此时退出?

最佳答案

好吧,使用前向声明。如您所说,这里有数百万种解释,现在有数百万种:

ErrorToken.h:

#ifndef H_ERROR_TOKEN
#define H_ERROR_TOKEN

#include "Token.h"

class EndToken;

class ErrorToken : public Token
{
public:
    EndToken makeEndToken();
};

#endif

EndToken.h:
#ifndef H_END_TOKEN
#define H_END_TOKEN

#include "Token.h"

class ErrorToken;

class EndToken : public Token
{
public:
    ErrorToken makeErrorToken();
};

#endif

现在,在每个实现文件中,您可以愉快地包含两个 header :
#include "ErrorToken.h"
#include "EndToken.h"

ErrorToken EndToken::makeErrorToken()
{
    return ErrorToken();   // example
}

EndToken ErrorToken::makeEndToken()
{
    return EndToken();
}

正如@James Kanze指出的那样,您可能对C++的工作方式感到困惑。以下代码可能更符合您期望的Java行为类型,并且在多态设计方式中更有意义:
class Token { virtual ~Token()  {} };

class ErrorToken : public Token
{
    std::unique_ptr<Token> makeEndToken();
};

class EndToken : public Token
{
    std::unique_ptr<Token> makeErrorToken();
};

std::unique_ptr<Token> EndToken::makeErrorToken()
{
    return { new ErrorToken; }
}

std::unique_ptr<Token> ErrorToken::makeEndToken()
{
    return { new EndToken; }
}

由于您仅通过基本指针处理对象,因此 header 不需要了解其他派生类的任何知识。 (我留给您将代码细分为文件;每个块都进入一个单独的文件。)

10-07 17:17