c++ - 是否有语法来防止类的实例是常量?

标签 c++ class c++11 constants mutable

假设我创建了一个类,其中主要用例将让用户始终调用修改其成员的方法。或者,从另一个角度来看,创建一个类,其中每个方法都会修改一个类成员。

例如,让我们使用这个虚拟类:

class Foo
{
public:
    void setM_1(int);
    void setM_2(char);
    void setM_3(float);

private:
    int     m_1;
    char    m_2;
    float   m_3;
};

对于这个 Foo 类,创建它的 const 实例没有意义,因为每个方法都保证修改一个成员。

我的目标是:以 const 实例化此类不会产生任何影响的方式定义此类。也就是说,const Foo 实例可以调用 Foo 实例可以调用的所有方法。

我能够通过将每个方法标记为 const,声明所有非 const 成员 mutable,并提供一个构造函数来实现此行为初始化类的所有成员。

所以 const - Foo 的无知版本看起来像:

class Foo
{
public:
    Foo()
    {
        m_1 = 0;
        m_2 = '\0';
        m_3 = 0.0f;
    }

    void setM_1(int)   const;
    void setM_2(char)  const;
    void setM_3(float) const;

private:
    mutable int     m_1;
    mutable char    m_2;
    mutable float   m_3;
};

我的问题是:是否有更优雅的方式来做到这一点?

或者,这只是糟糕的类设计吗? (请不要辩论)。

答案编辑后:
这是官方的:我只是胡扯了脑筋。

Kerrek SB 是对的:创建 const Foo 并使用类修改方法无论如何都会引发编译器错误,所以我的“const-ignorant”Foo 毫无意义。

一点文档就可以解决我的“问题”。

难怪我有一种预感,这是糟糕的类设计。

请问大家,这个问题一定很碍眼。感谢您的建设性批评。

最佳答案

您的目标根本不正确。 const 的存在不是为了好玩,而是因为它意味着您确实需要 const。这样的类(class)会严重中断,例如设置键 - 改变它会破坏排序。还有其他陷阱,例如在某些情况下将其作为临时提供时会发生什么。

如果你的类不能以 const 的方式实际使用,接口(interface)不应该对它撒谎并假装它是 const 而不是。

关于您关于糟糕设计的问题,我可以肯定地说,是的,这听起来像是一个真正糟糕的设计。

关于c++ - 是否有语法来防止类的实例是常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027510/

相关文章:

javascript - 通过 jQuery 添加类

c++ - 有没有办法使用对象及其非空参数列表调用运算符来生成 std​​::thread ?

c++ - 愉快地链接不兼容的类型会导致困惑

c++ - 我可以全局重定向 system() 调用的输出吗?

c++ - c_str() 是在堆中分配内存吗?

javascript - 对象文字和javascript中构造函数中具有值的类之间有什么区别?

c# - Windows 上的字体名称是否只有英文?

Java 外部类实例生命周期

c++ - Visual Studio 2012 是否正确执行此操作?标准::移动

c++ - 在线程内调用纯虚方法