静态成员具有不同的值

Static member has different values

本文关键字:静态成员      更新时间:2023-10-16

更新:我想我已经缩小了问题的范围,请参阅此处了解一个新问题,希望它更准确。

更新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;的定义,它就应该只有一个地址,并且在任何地方都可以作为一个地址访问。如果没有发生这种情况,你的实际代码和你发布的代码之间会有一些不同(这并不罕见,我预计我看到的一半以上的问题都缺少"真正出错的代码"[包括"没有发布代码"的情况])