静态成员具有不同的值
Static member has different values
更新:我想我已经缩小了问题的范围,请参阅此处了解一个新问题,希望它更准确。
更新2:我能够解决问题,请参阅上面的链接:-)
我试图了解我是否对静态成员变量的工作方式有一些根本性的困惑。
我有一个类(让我们称之为cProvider),它包含静态成员变量(例如指针)和get/set方法。这个类包含在另外两个类中,我们称它们为"cWriter"answers"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;}
不是一个真正的答案,但注释太长了,注释中的代码即使适合(除非它真的很短)也无法阅读
我只是根据你的代码做的:
#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;
的定义,它就应该只有一个地址,并且在任何地方都可以作为一个地址访问。如果没有发生这种情况,你的实际代码和你发布的代码之间会有一些不同(这并不罕见,我预计我看到的一半以上的问题都缺少"真正出错的代码"[包括"没有发布代码"的情况])
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- 为什么传递非静态成员函数会导致编译错误?
- 非静态成员失败的线程调用函数
- 静态成员变量不会由 gettext 转换
- decltype:使用指针访问类的静态成员
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- 如何在C++中定义静态成员结构