加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在这种情况下C可变吗?

发布时间:2020-12-16 10:55:22 所属栏目:百科 来源:网络整理
导读:我想问一下mutable的使用是否合适: #include iostreamclass Base{protected: int x;public: virtual void NoMod() const { std::cout x std::endl; } void Draw() const { this-NoMod(); }};class Derive : public Base{private: mutable int y;public: voi
我想问一下mutable的使用是否合适:

#include <iostream>

class Base
{
protected:
  int x;

public:
  virtual void NoMod() const
  {
    std::cout << x << std::endl;
  }
  void Draw() const
  {
    this->NoMod();  
  }
};

class Derive : public Base
{
private:
  mutable int y;

public:
  void NoMod() const
  {
    y = 5;
  }
};

int main()
{
  Derive derive;

  // Test virtual with derive
  derive.Draw();

  return 0;
}

Base类是第三方库.我正在扩展它以提供我自己的NoMod().库原始NoMod()声明为const.

我的NoMod()与Base的不同之处在于它需要修改自己的成员变量.

因此,对于我自己的NoMod()来编译并在调用Draw()时调用,我必须这样做

1)将Derive :: NoMod()实现为const
2)让我的内容变得可变.

这是我能做的最好的吗?

解决方法

正如“头脑极客”所描述的,您问题的答案取决于您的数据成员的使用方式.

我在一个类中区分了两种类型的数据成员.

我使用常用??术语“属性”来指代数据成员
这是对象的逻辑状态或“值”.
通常,属性很少被声明为可变的.

我创造了它表示的原型“贡献”
简单地“工作记忆/存储”的数据成员
这有点与对象的状态脱节.
Contributes与对象的用户没有上下文相关性,
它们存在于课堂上,只是为了维护
并有效地操作对象.
Contributes通常在类中声明为可变的并且始终是
私人或受保护的.

例如,假设您的对象是链接列表,
所以你有一个指向列表中第一项的指针.
我认为这个指针是有贡献的,因为
它不代表列表中的数据.
即使列表已排序和
指针设置为列表中的新第一项,
列表对象的用户可以更少关心
列表保持不变.只有列表数据有
是否已修改,列表是否已排序
与用户的观点相关.
即使您有一个booean数据成员’已排序’以快速确定
如果列表处于排序状态,那么这也是一个贡献
因为列表结构本身会影响排序状态,
‘sorted’变量成员仅用于有效地记住状态
无需扫描列表.

再举一个例子,如果你有一个const方法来搜索列表.
假设您知道通常搜索将返回
最近搜索过的项目,
你会在你的班级中保留一个指针给你的方法
可以在搜索之前首先检查最后找到的项目是否与搜索关键字匹配
整个列表(如果该方法确实需要搜索列表并查找
一个项目,指针将被更新).
这个指针我会认为是一个贡献,因为它
只是为了帮助加快搜索速度.即便如此
搜索更新指针贡献,方法是有效的
const因为容器中的所有项都没有被修改.

因此,属性的数据成员通常不会被声明为可变的,有助于对象运行的数据成员通常是可变的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读