假设我创建了一个类,其中主要用例将让用户始终调用修改其成员的方法。或者,从另一个角度来看,创建一个类,其中每个方法都会修改一个类成员。
例如,让我们使用这个虚拟类:
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/