隐藏不应该在基 class 中突变的成员变量,它只允许 const 访问,因此可以保留赋值运算符

Hiding member variables that should not be mutated in a base class which only allows const access so one can keep the assignment operator

我有一个永远不应该从它所在的 class 内部更改的成员变量,所以它应该是 const,但我想保留那个 [=] 的赋值运算符27=].

所以我想到了 "hide" 基 class 中的成员的想法,它只允许通过 getter:

进行常量访问
class Base
{
public:

    Base(Settings settings) : mSettings(settings) {}

    const Settings&
    GetSettings() const { return mSettings; }

private:

    Settings mSettings;
};

class Derived : Base
{
public:

    Derived(Settings settings) : Base(settings) {}
 };

我可以通过 getter 访问成员,不会意外更改它,它似乎比简单的包装器更好,因为包装器仍然可以通过它自己的赋值运算符被覆盖。

有人看到这有什么问题或陷阱吗?无论如何修改成员的任何后门方法都会使整个构造变得无用?

编辑:提供更多关于用例的上下文。 Settings 对应 Product class。它包括诸如产品尺寸之类的东西。产品无法自行调整大小,我想通过以某种方式限制对设置的访问作为 const 来防止意外这样做。但是,客户端代码可以进行赋值 x = y //Product x now has the same properties as y

从技术上讲,您仍然可以这样写:

void oops(Settings s) {*dynamic_cast<Base*>(this) = Base(s);}

但是,老实说,良好的程序设计和良好的编程实践来了 side-by-side。我认为你很安全:如果有人走到这一步来破坏你的界面,那么你雇用的程序员就有问题了。诸如 privateprotected 之类的访问修饰符并不意味着安全功能:它们可以帮助您,优秀的开发人员TM,为了避免搬起石头砸自己的脚,他们通过向编译器(和你自己)提供更多关于谁应该访问什么信息的信息来做到这一点,这样它就可以生成有用的错误消息,旨在防止这样的错误。

简而言之:您是这里的老板,而不是编译器。清楚地表达您的意图(就像您已经做过的那样)并且不要尝试以显然不适合使用的方式使用界面,这样您会没事的。