【发布时间】:2016-05-09 09:50:09
【问题描述】:
生日,
使用 C++,我想要一个包含多个公共成员对象的全局对象,这些公共成员对象可以“通过”全局对象进行访问,同时成员对象中的代码应该能够调用通过将全局对象作为全局对象进行访问(即不将全局对象的特定引用传递给成员对象)。
我认为这会很简单,就像下面我简化的示例代码一样,但它不会编译。在 IDE 中,查看头文件时,我收到“重新定义 GlobalObject / MemberObject”和“未知类型名称”警告(尽管每个头文件中都有“pragma once”?)。当我编译代码时,编译器会报告“GlobalObject / MemberObject is undefined”错误。
我想我有某种循环引用问题,但老实说我不明白为什么,因为虽然全局对象包含对成员对象的引用,但成员对象却没有t 包含对全局对象的引用,因为我打算让它们以与任何其他代码直接从主函数访问它的方式相同的方式访问全局对象......?通过在主函数之外声明 GlobalObject 然后在 MemberObject 头文件中将其作为外部引用来实现 GlobalObject 不是全局的,还是我在这里弄错了?
我知道人们对全局对象的邪恶有强烈的看法,但我相信在某些情况下它们是合适的,特别是在资源有限且本质上是“启动”而不是“关闭”的嵌入式系统中(或者至少不要以受控方式关闭 - 电源刚刚关闭)。所以我想知道如何才能使我正在尝试做的事情发挥作用,或者如果不能,我想了解为什么不这样做。
如果有人愿意提供任何指导,我将不胜感激,谢谢。
GlobalObject.h
#pragma once
#include "MemberObject.h"
class GlobalObject
{
private:
int Data;
int Total;
public:
GlobalObject();
MemberObject MO;
int GetData(void);
void SetData(int NewData);
int GetTotal(void);
void SetTotal(int NewTotal);
};
GlobalObject.cpp
#include "GlobalObject.h"
GlobalObject::GlobalObject() : MO() { Data = 0; Total = 0; }
int GlobalObject::GetData(void) { return Data; }
void GlobalObject::SetData(int NewData) { Data = NewData; }
int GlobalObject::GetTotal(void) { return Total; }
void GlobalObject::SetTotal(int NewTotal) { Total = NewTotal; }
MemberObject.h
#pragma once
#include "GlobalObject.h"
extern GlobalObject GO;
class MemberObject
{
private:
int Data;
public:
MemberObject();
int GetData(void);
void SetData(int NewData);
void SetGlobalTotal(void);
};
MemberObject.cpp
#include "MemberObject.h"
MemberObject::MemberObject() { Data = 0; }
int MemberObject::GetData(void) { return Data; }
void MemberObject::SetData(int NewData) { Data = NewData; }
void MemberObject::SetGlobalTotal(void) { GO.SetTotal(GO.GetData() + Data); }
main.cpp
#include "GlobalObject.h"
GlobalObject GO;
int main(void)
{
GO.SetData(1000);
GO.MO.SetData(2000);
GO.MO.SetGlobalTotal();
}
【问题讨论】:
-
你知道#include 是如何工作的吗?您不能有两个文件相互包含的循环。 (嗯,你可以,但它不会像你期望的那样工作)
标签: c++