0

我遇到了一个我觉得很愚蠢的问题,因为它基本上只是在 2000 行工作 OOP 脚本中的两行代码。

切入正题——我有一个实体类,它提供各种信息(姓名、地址、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;
}

这是我的类(ID( int ) 方法在 AgencyNetwork::createXXX() 中调用,并在每个 toStr() 方法中使用(在每个类的末尾)):

Entity.cpp , AgencyNetwork.cpp , Agent.cpp

已解决:我忘记在每个 operator= 中添加 ID mutator。感谢所有帮助过的人:)

4

2 回答 2

4

最值得注意的是,赋值运算符 ofEntity被破坏:

Entity& Entity::operator= ( const Entity& tocopy ) {
    delete this; // <<< don't do that 

    this -> name ( tocopy.name() );
    this -> address ( tocopy.address() );
    // <<< missing _ID

    return *this;
}
于 2012-01-16T19:20:14.623 回答
0

没有魔法。有明显的BUG。所以,让我们使用跟踪:跟踪每个“mutator”调用。确保没有人可以通过 mutator 调用以外的其他方式访问 _ID 字段。还跟踪构造函数、复制构造函数、复制赋值运算符和析构函数调用。然后运行您的代码并跟踪跟踪日志。我相信在你的情况下一切都会变得清晰。

注意:如果您的实现遗漏了上面提到的一些成员函数,您应该使用仅包含跟踪器调用的主体来定义它们。

您不应该让编译器生成任何隐式成员函数,以确保您完全控制您的类,特别是该_ID字段。

于 2012-01-16T19:26:00.087 回答