成员值在同一函数的连续调用之间发生变化

时间:2009-12-02 00:22:13

标签: c++

我有一个CognitiveEntity类,用这种方式定义:

class CognitiveEntity : public Object
{
public:
  CognitiveEntity (FuzzyCognitiveMap fcm, SystemState s);
  ~CognitiveEntity ();

  template <typename T> void RegisterChange (std::string context, T value);

  bool operator!= (const CognitiveEntity& rhs) const;

private:
  FuzzyCognitiveMap m_fuzzyCognitiveMap;
  SystemState       m_systemState;

  std::vector <SystemState> RunFuzzyCognitiveMap ();
};

如图所示,CognitiveEntity有一个SystemState对象,后者又有一个Concept个对象的向量(只显示最相关的行):

class SystemState
{
public:
  SystemState ();
  ~SystemState ();

  void       AddConcept (Concept c) { m_L.push_back(c); }
  std::vector <Concept> m_L;
};

CognitiveEntity::RegisterChange内,我将一个概念标记为潜在原因(通过调用Concept::IsPotentialCause (bool)仅仅设置了传递值的私有成员):

template <typename T>
void
CognitiveEntity::RegisterChange (std::string context, T value)
{
  std::string name = context.substr(context.find_last_of ("/") +1);
  int pos = m_systemState.FindConcept(name);
  if (pos > -1)
  {
    int intValue = value ? 1 : 0;
    m_systemState.m_L[pos].SetConceptValue (intValue, false);

    if (m_systemState.m_L[pos].CheckVariation ())
    {
      m_systemState.m_L[pos].IsPotentialCause (true); // Mark this concept as a potential cause

      for (int cause = 0; cause < m_systemState.GetSize (); cause++)
      {
        if ( (cause != pos) && (m_systemState.m_L[cause].MayBeCause ()))
        {
          m_fuzzyCognitiveMap.UpdateFuzzyCognitiveMapEntry (cause, pos, m_systemState);
          m_systemState.m_L[cause].IsPotentialCause (false);
        }
      }
    }
  }

}

发生的情况是,只要再次调用RegisterChange,标记为潜在原因的Concept就不再标记。 我尝试运行gdb,我确信该成员没有设置在别处。

我不确定这些小信息是否足以让你给我一些关于这种行为的提示(我不想用SystemState和{{1}的代码充斥帖子}))。

此致 JIR

2 个答案:

答案 0 :(得分:0)

如果这是一个多线程系统,我会说这听起来像一个共享的,可变状态的经典案例,没有正确同步。

如果你没有多线程的情况,我会说在这个变量上设置一个监视器,看看它有什么变化。

答案 1 :(得分:0)

解决了在网络模拟器中如何调用代码的问题(该代码本应在“ns-3”网络模拟器中使用)。

所以,问题甚至不在我发布的代码中,但是你设法帮助我找到解决方案:感谢你给我的建议,我准备了一个独立版本的代码,我看了变量。

问题是我如何传递对象。 具体来说,不是通过引用传递对象(我以为我在做),我应该使用智能指针。

谢谢大家的见解! (抱歉这个烂摊子......下次我会更准确!)