我在 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/