隐藏的成员变量不应在仅允许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
,但我想保留该类别的分配运算符。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);}
但是,老实说,良好的程序设计和良好的编程实践并排。我认为您足够安全:如果有人走这么远以打破您的界面,那么您正在雇用的程序员有问题。诸如private
和protected
之类的访问修饰符并不是一项安全功能:它们可以帮助您,良好的开发人员 tm 以避免在脚下拍摄自己,并且他们通过向编译器(和您自己(提供有关谁应该访问哪些信息的更多信息来做到这一点,以便生成旨在防止此类错误的有用错误消息。
简而言之:您是这里的老板,而不是编译器。清楚地表达了您的意图(就像您已经完成的那样(,并且不要以显然不是要使用的方式使用界面,并且您会没事的。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符