gpt4 book ai didi

c++ - 隐藏不应该在只允许 const 访问的基类中改变的成员变量,这样就可以保留赋值运算符

转载 作者:行者123 更新时间:2023-11-28 04:18:20 25 4
gpt4 key购买 nike

我有一个永远不应该从它所在的类内部更改的成员变量,因此它应该是 const,但我想保留该类的赋值运算符。

所以我想出了将成员“隐藏”在基类中的想法,该基类只允许通过 getter 进行 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 ,为了避免搬起石头砸自己的脚,他们通过向编译器(和你自己)提供更多关于谁应该访问什么信息的信息来做到这一点,这样它就可以生成有用的错误消息,旨在防止这样的错误。

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

关于c++ - 隐藏不应该在只允许 const 访问的基类中改变的成员变量,这样就可以保留赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56064835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com