更新:我认为我能够缩小问题范围,see here以获得更准确的新问题。
更新2 :我能够解决问题,请参阅上面的链接: - )
我试图了解我是否对静态成员变量的工作方式产生了根本的困惑。
我有一个类(让我们称之为cProvider),它包含静态成员变量(例如指针)和get / set方法。这个类包含在另外两个类中,我们将它们称为“cWriter”和“cReader”,并将它们实例化。 cWriter只访问setter方法,cReader访问getter方法。
我的问题是,似乎是静态变量的多个实例,这意味着当我通过cWriter访问cProvider的静态变量时,它会访问与通过cReader访问同一变量时不同的物理位置。
这是预期的吗?我在一个相当复杂且可能未知的框架ADTF中这样做。很可能框架是造成这种行为的原因。我检查了进程ID,cWriter和cReader具有相同的进程ID。
他们仍然可以访问不同地址的原因是什么?我从未接受过正式的编程教育,所以我可能会遗漏一些关于静态变量如何工作的基本知识。关于可能出现问题的任何提示,我感到很高兴!
编辑:我的代码的简化版本:(显示要点)
OdometryHistoryWriter.h:
class cOdometryHistoryWriter
{
static bool something;
}
OdometryHistoryWriter.cpp:
bool cOdometryHistoryWriter::something;
OdometryHistoryProviderInputFilter.h:
#include OdometryHistoryWriter.h
class cOdometryHistoryProviderInputFilter
{
cOdometryHistoryWriter m_odoHistWriter;
void setSomething(boolvar);
}
OdometryHistoryProviderInputFilter.cpp:
#include OdometryHistoryProviderInputFilter.h
void OdometryHistoryProviderInputFilter::setSomething(boolvar)
{
m_odoHistWriter.something = boolvar;
return;
}
OdometryHistoryProvider.h:
class cOdometryHistoryProvider
{
bool getSomething();
cOdometryHistoryWriter m_odoHistAcessor;
}
OdometryHistoryProvider.cpp:
bool cOdometryHistoryProvider::getSomething()
{ return m_odoHistAcessor.something;}
答案 0 :(得分:4)
不是一个真正的答案,但是发表评论的时间太长了,评论中的代码即使在适合的情况下仍然无法阅读[除非它真的很短]
我刚刚根据您的代码执行此操作:
#include <iostream>
class cOdometryHistoryWriter
{
public:
static bool something;
};
bool cOdometryHistoryWriter::something = false;
class cOdometryHistoryProviderInputFilter
{
public:
cOdometryHistoryWriter m_odoHistWriter;
void setSomething(bool b) { m_odoHistWriter.something = b; }
};
class cOdometryHistoryProvider
{
public:
bool getSomething() { return m_odoHistAcessor.something; }
cOdometryHistoryWriter m_odoHistAcessor;
};
int main()
{
cOdometryHistoryProvider a;
cOdometryHistoryProviderInputFilter b;
b.setSomething(true);
std::cout << "Expect true:" << a.getSomething() << std::endl;
b.setSomething(false);
std::cout << "Expect False:" << a.getSomething() << std::endl;
}
并输出:
Expect true:1
Expect False:0
正如你所期望的那样(至少我是这样)。
只要您只有bool cOdometryHistoryWriter::something = false;
的一个定义,它应该只有一个地址,并且可以在任何地方同时访问。如果没有发生这种情况,那么您的ACTUAL代码和您发布的代码之间的差异就会有所不同(不是那么不寻常,我希望我看到的问题中有一半以上缺少“实际使其出错的代码”[包含案例] “没有发布代码”])