c++ - 如何转发声明用作成员变量的结构

标签 c++ compiler-errors forward-declaration

我在 Application.h 中定义了一个名为 CardState 的结构:

#ifndef APPLICATION_H
#define APPLICATION_H

#include <Session.h> // Note that both files include each others

struct CardState {
    bool property1;
    bool property2;
};

class Application : public QApplication {

    Q_OBJECT

public:

    explicit Application(int argc, char *argv[]);

}

然后我在不同的文件中使用此 CardState 类型:

#ifndef SESSION_H
#define SESSION_H

#include <Application.h>

struct CardState;

class Session : public QObject {

    Q_OBJECT

public:

    void setCardState(const CardState& cardState);
    CardState cardState() const;

private:

    CardState cardState_;

};

}
#endif // SESSION_H

在包含 Session.h 时,似乎还没有包含 Application.h,所以我需要转发声明结构(见上文)。然而,这还不够,在添加前向声明后,我仍然得到这个错误:

'Session::cardState_' uses undefined struct 'CardState'

如果我理解正确,这意味着编译器不知道如何初始化我的变量,因为 CardState 只是部分声明。我知道我可以通过使 CardState 成为一个指针来解决这个问题,这通常是我所做的,但是还有其他更合适的方法来解决这个问题吗?

最佳答案

根据 Oli Charlesworth 的评论,这应该可以正常工作。

在一般情况下,您可能想要:

  • CardState 放入它自己的 header 中,然后将其#include 到所有“客户端” header 中,从而避免因包含这些 header 的顺序而可能出现的任何复杂情况。
  • Session::cardState_ 声明为(智能)指针,避免需要实际的 CardState 声明。

-- 编辑 ---

既然您编辑了代码,很明显毕竟存在循环包含依赖项,在这种情况下您的代码确实无法正常工作,因此您必须应用上述解决方案之一。

关于c++ - 如何转发声明用作成员变量的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6940918/

相关文章:

c++ - 如何定义来自非模板基类的成员函数

C++——最快的整数类型?

c++ - 左值需要作为运算符重载赋值的左操作数

c++ - Data Racing in Reading 形式的 openMP 共享内存

c++ - Thrift TNonblockingServer.cpp未声明的标识符-Windows

在终端编译一个C程序问题

visual-studio-2008 - 从VS2008 Prof迁移到VC++ Express 2008时出现构建问题

c++ - 不完整类型和前向声明的无效使用

c++ - ‘{’ 标记之前的预期类名

c++ - 有没有办法转发声明协方差?