静态成员具有不同的值

时间:2015-03-25 00:14:01

标签: c++ linux

更新:我认为我能够缩小问题范围,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;}

1 个答案:

答案 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代码和您发布的代码之间的差异就会有所不同(不是那么不寻常,我希望我看到的问题中有一半以上缺少“实际使其出错的代码”[包含案例] “没有发布代码”])