j'ai une classe CognitiveEntity
, défini de cette façon:valeur membres, les changements entre les appels successifs de la même fonction
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();
};
Comme le montre, un CognitiveEntity
a un objet SystemState
, ce qui a un vecteur de Concept
objets (seules les lignes les plus pertinentes sont présentées):
class SystemState
{
public:
SystemState();
~SystemState();
void AddConcept (Concept c) { m_L.push_back(c); }
std::vector <Concept> m_L;
};
a l'intérieur du CognitiveEntity::RegisterChange
, je marque un concept comme une cause potentielle (en appelant Concept::IsPotentialCause (bool)
qui définit simplement un membre privé la valeur passée):
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);
}
}
}
}
}
Ce qui se passe est que dès que RegisterChange
est appelé une autre fois, l'Concept
qui a été marqué comme cause potentielle, est marqué plus. J'ai essayé d'exécuter gdb et je suis sûr que ce membre n'est pas défini ailleurs. Je ne suis pas sûr si cette petite information est suffisante pour que vous me donniez quelques indications sur un tel comportement (je ne voulais pas inonder le poste avec le code des deux classes SystemState
et Concept
).
Cordialement, Jir
Vous ne gérez pas le cas de plusieurs concepts avec le même nom, avez-vous besoin de cela? Si non, pourquoi n'utilisez-vous pas quelque chose comme une «carte»? Peut-être que de nouveaux 'Concept' ont été ajoutés entre les appels à' RegisterChange() '. –
Comme Tim dit ci-dessous, il ne semble pas vraiment y avoir assez ici pour continuer. Vous dites que vous êtes sûr que "le membre n'est pas défini ailleurs" ... mais voulez-vous dire que Concept ne modifie que le membre dans IsPossibleCause ou voulez-vous dire que le code ci-dessus représente les SEULS appels à IsPossibleCause ?? – imaginaryboy
gf: Je suis sûr qu'il n'y a pas plusieurs concepts avec le même nom. Cependant, j'ai trouvé plus facile de travailler avec des conteneurs 'vector' (en fait, je suis nouveau dans les conteneurs STL et je n'ai pas vraiment inspecté les autres conteneurs). De plus, aucun concept n'a été ajouté entre les appels. imaginaryboy: désolé pour la description désordonnée. Ce que je voulais dire, c'est que 'Concept' ne modifie que le membre dans' IsPossibleCause' et que 'IsPossibleCause' n'est appelé que dans ce morceau de code. – Jir