【问题标题】:Changing object state in const method在 const 方法中更改对象状态
【发布时间】:2015-11-08 16:52:27
【问题描述】:

我有类似这样的课程:

class A{
    std::string tmp;
public:
    const std::string &doSomething() const{
       tmp = "something";
       return tmp; 
    }
};

方法doSomething()const 并返回引用而不是字符串本身非常重要。

我看到的唯一方法是通过动态分配来做到这一点,例如类似:

class A{
    MyClass *tmp = new MyClass();
public:
    const MyClass &doSomething() const{
       *tmp = "something";
       return *tmp; 
    }
};

tmp 变量“占位符”仅在 doSomething() 内使用。

还有其他更清晰、更好的方法来存储这种临时值吗?

【问题讨论】:

  • 为什么不const std::string&
  • 这是一个非常糟糕的主意。您应该考虑重新设计该类。
  • @cad 错字,将编辑

标签: c++ class c++11 constants


【解决方案1】:

您可以在std::string tmp 上使用mutable 修饰符:

class A {
  mutable std::string tmp;
  ...
}

这将允许const 方法修改该成员。

【讨论】:

  • 那将是一个糟糕的主意。
  • 使用该语言支持的工具是否完全用于预期用途?
  • mutable 并不是真正的意思。但是,如果 OP 想编写糟糕的代码,那就是他们的问题。让const 方法破坏对象的逻辑常量仍然是一个糟糕的主意。无论如何,这可能是一个 XY 问题。
  • Mutable 正是为此而设计的,第 7.1.1 节:类数据成员上的 mutable 说明符使应用于包含类对象的 const 说明符无效,并允许修改 mutable 类成员,即使对象的其余部分是 const。如果 OP 需要能够从 const 方法修改临时类成员,这正是 mutable 的目的。如果tmp 变量与对象本身的状态无关,那么使用它是完全有意义的。这是一个XY问题,我回答了这个问题,因为最初的意图是未知的。
  • 这就像是说new 的目的是制造内存泄漏。 mutable 用于不改变对象逻辑常量的状态改变操作。
【解决方案2】:

查看 mutable 关键字以声明 tmp

【讨论】:

    【解决方案3】:

    如果你尝试修改属性,你应该退出方法签名的 const 限定符:

    std::string& doSomething() { ... }

    如果您不想修改它,并且想确保该方法返回您等待接收的任何内容:

    const std::string& doSomething() const {...}

    返回 const 引用是确保引用不会改变值的最佳方式。但是在返回类型之前没有 const 限定符也应该可以正常工作,因为第二个 const 限定符(它指定方法不应该修改当前对象)

    总之,我完全同意@juanchopanza 干杯

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多