c++ - 只能在 operator=() 中修改的类成员的 C++ 模式
问题描述
我希望能够声明一个只能在构造函数或赋值运算符中修改的类成员。由于const
分配问题,声明不起作用。
class foo
{
const int x;
public:
foo(int inp) : x(inp) {}
foo(const foo &src) : x(src.x) {}
foo& operator=(foo&src)
{
x = src.x; //compiler error (not desired)
return *this;
}
void bar()
{
x = 4; //compiler error (desired)
}
};
有谁知道可以做到这一点的优雅设计模式?我发现const
成员的用处极其有限。但是,如果有一种模式只允许修改一个成员,operator=
而在其他任何修改它的地方给出错误,我可能会大量使用它。
解决方案
您可以标记x
为private
,然后在派生自的类中实现所有其他方法foo
:
class foo
{
private:
int x;
protected:
int y;
public:
foo(int inp) : x(inp) {}
foo(const foo &src) : x(src.x) {}
foo& operator=(foo&src)
{
x = src.x;
return *this;
}
};
class derived : public foo
{
public:
void bar()
{
x = 4; // compiler error (desired)
y = 42; // ok
}
};
推荐阅读
- acumatica - 自定义 PXSelector 控件当用户在 Grid 上添加另一行时清除
- spring - ClassNotFoundException: org.apache.logging.log4j.util.StackLocator$FqcnCallerLocator on spring boot 2.3.4 and log4j 2.13.3
- swift - 如何在现实世界中随机放置 AR 对象?
- node.js - 如何使用 Google 计算 node.js api 创建具有公共 IP 地址的接口?
- mysql - 从 Dash 框架中的输入字段中检索值
- javascript - React.js 用户对话 UI 设计
- sql-server - 在 SQL Server 中使用条件读取节点值
- typescript - TypeScript 中的另一个多态性问题
- python - Pandas 基于单个列进行聚合,同时保留其他列
- git - 从 master 获取最新更新到我的分支