隐藏的成员变量不应在仅允许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

本文关键字:突变 基类 运算符 分配 保留 访问 const 变量 成员 隐藏      更新时间:2023-10-16

我有一个成员变量,该变量绝不应该从上课的内部更改,因此应该是 const,但我想保留该类别的分配运算符。p>所以我想出了一个只允许const访问槽的基类中"隐藏"成员的想法:

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类。它包括诸如产品尺寸之类的东西。产品无法调整大小,我想通过以某种方式限制对设置为const的访问,以防止意外地这样做。但是,客户代码进行分配x = y //Product x now has the same properties as y

是可以的

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

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

但是,老实说,良好的程序设计和良好的编程实践并排。我认为您足够安全:如果有人走这么远以打破您的界面,那么您正在雇用的程序员有问题。诸如privateprotected之类的访问修饰符并不是一项安全功能:它们可以帮助您,良好的开发人员 tm 以避免在脚下拍摄自己,并且他们通过向编译器(和您自己(提供有关谁应该访问哪些信息的更多信息来做到这一点,以便生成旨在防止此类错误的有用错误消息。

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