【问题标题】:c++ int accessor return 0 even if mutator sets properly即使mutator设置正确,c ++ int访问器也返回0
【发布时间】:2012-01-16 19:06:45
【问题描述】:

我遇到了一个我觉得很愚蠢的问题,因为它基本上只是一个 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.cppAgencyNetwork.cppAgent.cpp

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

【问题讨论】:

  • 任何能重现问题的小型独立样本?
  • 嗯,AgencyNetwork.ccp 第 139 行是对 mutator 的调用,Agent.cpp 第 275 行是对访问器的调用。我希望这就是你的样本。我认为仅仅将 mutator/accessor 放在“野外”并没有什么意义,因为它是 OOP :)
  • 从 'mutator' 成员函数返回 int & 不好。尝试返回普通的int
  • DaddyM:谢谢你的建议,但我都试过了,没有任何改变。
  • “独立样本”是我们可以复制、粘贴、编译和运行的代码。例如int main() {Entity entity;entity.ID(2);cout<<entity.ID();return 0;}(当然格式更好)以及实体标头和实现。没有标头,我们无法编译您的实现。

标签: c++ oop getter-setter accessor mutators


【解决方案1】:

最值得注意的是,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;
}

【讨论】:

  • 您好 Georg,感谢您的指出,我忘记了这一点,但遗憾的是,它并不能解决问题:/
  • 你好乔治!它现在正在工作 - 问题出在所有类的 operator= 中,我只是忘记在任何地方添加 ID。谢谢!
  • @Asmodiel,不要忘记另一个错误。不要这样做delete this。此外,在这种情况下,您可能不应该编写自己的 operator=。在这种情况下,编译器将提供一个合理的默认值,因为您使用的成员是 stringint。事实上,如果该类的设计需要自定义operator=(例如char * 而不是字符串),那么我会尝试更改设计!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2019-03-28
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多