我遇到了一个我觉得很愚蠢的问题,因为它基本上只是在2000行工作OOP脚本中的两行代码。
切入追逐 - 我有一个Entity类,它提供各种信息(名称,地址,ID)。问题是 - 即使ID mutator(setter)设置了一个正确的值(用cout和返回值测试),访问器总是返回0.
// ID accessor
int Entity::ID() const {
return _ID;
}
// ID mutator
int& Entity::ID( int newID ) {
if ( newID >= 0 ) {
_ID = newID;
}
return _ID;
}
以下是我的类(在AgencyNetwork :: createXXX()中调用ID(int)方法,并在每个toStr()方法中使用(在每个类的末尾)):
Entity.cpp,AgencyNetwork.cpp,Agent.cpp
已解决:我忘了在每个operator =中添加ID mutator。感谢所有帮助过的人:)
答案 0 :(得分:4)
最值得注意的是,Entity
的赋值运算符已被破坏:
Entity& Entity::operator= ( const Entity& tocopy ) {
delete this; // <<< don't do that
this -> name ( tocopy.name() );
this -> address ( tocopy.address() );
// <<< missing _ID
return *this;
}
答案 1 :(得分:0)
没有魔力。有简单的BUG。所以,让我们使用跟踪:跟踪每个'mutator'调用。确保没有人可以通过mutator调用以其他方式访问_ID字段。跟踪构造函数,复制构造函数,复制赋值运算符和析构函数调用。 然后运行代码并按照跟踪日志。 我相信你的一切都会变得清晰。
注意:如果您的实现错过了上面提到的某些成员函数,您应该使用仅包含跟踪器调用的主体来定义它们。
您不应让编译器生成任何隐式成员函数,以确保您完全控制您的类,特别是_ID
字段。