C++ 成员值在同一函数的连续调用之间更改

C++ 成员值在同一函数的连续调用之间更改,c++,C++,我有一个认知实体类,定义如下: class CognitiveEntity : public Object { public: CognitiveEntity (FuzzyCognitiveMap fcm, SystemState s); ~CognitiveEntity (); template <typename T> void RegisterChange (std::string context, T value); bool operator!= (co

我有一个
认知实体
类,定义如下:

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::RegisterChange
中,我将一个概念标记为一个潜在原因(通过调用
Concept::IsPotentialCase(bool)
,它仅使用传递的值设置一个私有成员):

模板
无效的
认知实体::注册表更改(std::字符串上下文,T值)
{
std::string name=context.substr(context.find\u last\u of(“/”)+1);
int pos=m_systemState.FindConcept(名称);
如果(位置>-1)
{
int intValue=值?1:0;
m_systemState.m_L[pos].SetConceptValue(intValue,false);
if(m_systemState.m_L[pos].CheckVariation())
{
m_systemState.m_L[pos].IsPotentialCause(true);//将此概念标记为潜在原因
for(int cause=0;cause
发生的情况是,只要下次调用
RegisterChange
,被标记为潜在原因的
概念就不再被标记。
我试着运行gdb,我确信这个成员并没有设置在其他地方

我不确定这一点信息是否足以让你给我一些关于这种行为的提示(我不想在帖子中充斥
SystemState
Concept
类的代码)

问候,,
Jir

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


如果您没有多线程的情况,我会说在该变量上设置一个手表,看看是什么改变了它。

结果表明,问题在于如何从网络模拟器中调用代码(该代码打算在“ns-3”网络模拟器中使用)

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

问题是我是如何通过这个物体的。 具体来说,我应该使用智能指针,而不是通过引用传递对象(正如我所想的那样)

感谢大家的伟大见解!
(很抱歉弄得一团糟……下次我会更准确!)

您不处理多个同名概念的情况,需要吗?如果不是,为什么不使用
地图
?可能在调用
RegisterChange()
之间添加了一些新的
概念。您说您确信“该成员未设置在其他位置”。。。但是你是说Concept只修改IsPossibleCause中的成员,还是说上面的代码表示对IsPossibleCause的唯一调用?gf:我肯定没有多个同名的概念。然而,我发现使用
vector
容器更容易(事实上,我对STL容器还不熟悉,我并没有真正检查过其他容器)。此外,在通话之间没有添加任何概念。想象男孩:对不起,描述得这么混乱。我的意思是,
Concept
只修改
IsPossibleCause
中的成员,而且
IsPossibleCause
仅在该段代码中调用。好建议!我发现该对象的副本被修改了,而不是原件。我只能接受它。需要15点声望才能投票,抱歉:)
class SystemState
{
public:
  SystemState ();
  ~SystemState ();

  void       AddConcept (Concept c) { m_L.push_back(c); }
  std::vector <Concept> m_L;
};
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);
        }
      }
    }
  }

}