处理C++类中难以避免的大量const成员

Dealing with hard to avoid large numbers of const members in a C++ class

本文关键字:const 成员 难以避免 C++ 处理      更新时间:2023-10-16

这是我上一个问题的后续问题:

在C++类中使用复杂函数初始化常量成员

简而言之,我有一个程序,它有一个类Grid,其中包含三维栅格的属性。我希望这个网格的属性在创建后是只读的,这样类中的复杂函数就不会意外地把网格弄乱(比如if(bla=10(,而不是if(bla==10((等等。现在,这个问题在前面的讨论中已经得到了很好的回答:通过create函数调用初始值设定项列表。

我的新问题来了。我的网格有很多属性,它们只是简单地描述了网格(网格点的数量、网格点的坐标等(,对于这些属性,在不同的对象之间重新分配它们是没有意义的。尽管如此,C++中的基础教科书总是将具有大量参数的函数与糟糕的设计联系起来,但我需要它们才能拥有常量成员变量。

是否有任何标准的技术来处理这些问题?

答案取决于您试图保护的内容。

  1. 如果您试图确保类的用户不会无意中更改关键参数,那么实现这一点的方法是将这些成员声明为privateprotected,并且仅在类实现之外需要const getter时才提供它们。

  2. 如果您试图确保Grid类的实现程序不会更改这些值,那么有几种方法可以做到这一点。一种简单的方法是创建一个只包含这些参数的子类,然后答案看起来就像1。另一种方法是将它们声明为const,在这种情况下,在构造Grid实例时必须初始化它们。

如果答案是2,那么还可以做一些其他事情来防止无意中改变临界值。在编写和测试类实现的过程中,可以临时为关键参数使用固定的伪const值,以确保编写的其他函数不会更改这些值。

在编写if (i == 7) ...时,避免if (i=7) ...错误的另一个技巧是始终将常量放在第一位。即写入if (7 == i) ...。此外,任何一个好的编译器都应该能够标记这种错误的警告——确保你通过打开编译器提供的所有警告和错误报告来利用这一功能。