处理C++类中难以避免的大量const成员
Dealing with hard to avoid large numbers of const members in a C++ class
这是我上一个问题的后续问题:
在C++类中使用复杂函数初始化常量成员
简而言之,我有一个程序,它有一个类Grid,其中包含三维栅格的属性。我希望这个网格的属性在创建后是只读的,这样类中的复杂函数就不会意外地把网格弄乱(比如if(bla=10(,而不是if(bla==10((等等。现在,这个问题在前面的讨论中已经得到了很好的回答:通过create函数调用初始值设定项列表。
我的新问题来了。我的网格有很多属性,它们只是简单地描述了网格(网格点的数量、网格点的坐标等(,对于这些属性,在不同的对象之间重新分配它们是没有意义的。尽管如此,C++中的基础教科书总是将具有大量参数的函数与糟糕的设计联系起来,但我需要它们才能拥有常量成员变量。
是否有任何标准的技术来处理这些问题?
答案取决于您试图保护的内容。
-
如果您试图确保类的用户不会无意中更改关键参数,那么实现这一点的方法是将这些成员声明为
private
或protected
,并且仅在类实现之外需要const
getter时才提供它们。 -
如果您试图确保
Grid
类的实现程序不会更改这些值,那么有几种方法可以做到这一点。一种简单的方法是创建一个只包含这些参数的子类,然后答案看起来就像1。另一种方法是将它们声明为const
,在这种情况下,在构造Grid
实例时必须初始化它们。
如果答案是2,那么还可以做一些其他事情来防止无意中改变临界值。在编写和测试类实现的过程中,可以临时为关键参数使用固定的伪const
值,以确保编写的其他函数不会更改这些值。
在编写if (i == 7) ...
时,避免if (i=7) ...
错误的另一个技巧是始终将常量放在第一位。即写入if (7 == i) ...
。此外,任何一个好的编译器都应该能够标记这种错误的警告——确保你通过打开编译器提供的所有警告和错误报告来利用这一功能。
- 不允许运算符 const 参数调用 const 成员函数
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 如何避免将 const 和非 const 成员函数输入到模板中的代码重复
- 初始化 const 成员的正确方法
- 使用 Boost 对具有 const 成员的类进行序列化
- 非常量调用 const 成员函数失败,只读位置C++
- PIMPL类的设置应该是const成员函数
- 与其他静态const成员初始化静态常量成员
- decltype 不会推断 const 对象的 const 成员
- 如何初始化不是静态的const成员
- 如何使用常量变量初始化类的 const 成员变量
- 使用模板参数初始化静态 const 成员
- 与const成员配对的向量
- 通过参考const成员通过参考时,尝试引用已删除的函数
- const成员初始化之前的用法是GCC和Clang的这种预期行为
- 通过const成员变量访问内联函数
- 与const成员一起安排新的和班级的分配
- 在const函数中调用非CONST成员的非const函数
- 为什么即使对于 "copy on write" 的 const 成员函数也返回一个代理类?