我有一个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
答案 0 :(得分:0)
如果这是一个多线程系统,我会说这听起来像一个共享的,可变状态的经典案例,没有正确同步。
如果你没有多线程的情况,我会说在这个变量上设置一个监视器,看看它有什么变化。
答案 1 :(得分:0)
解决了在网络模拟器中如何调用代码的问题(该代码本应在“ns-3”网络模拟器中使用)。
所以,问题甚至不在我发布的代码中,但是你设法帮助我找到解决方案:感谢你给我的建议,我准备了一个独立版本的代码,我看了变量。
问题是我如何传递对象。 具体来说,不是通过引用传递对象(我以为我在做),我应该使用智能指针。
谢谢大家的见解! (抱歉这个烂摊子......下次我会更准确!)