2

我有一个适用于 3d 网格的程序。这个网格有它自己的类对象 Grid,看起来像这样(简化版):

class Grid
{
  public:
    Grid() { readDataFromInputFile(); }
  private:
    void readDataFromInputFile() {...} // this function reads the values for i, j, k from disk
    int i; int j; int k;
};

我现在想做的是能够将变量 i、j 和 k 设置为 const int,以避免在其他函数中意外地弄乱它们。然而,我不能轻易地将它们设置在成员初始化器列表中,因为它们必须从文件中读取。我一直在浏览现有的讨论,但我找不到关于这个问题的准确讨论。

有没有一种解决方案可以将它们设置为 const,并且仍然可以使用复杂的函数来检索数据?在我的实际应用程序中,当然还有更多的变量要读取,初始化后不允许更改。

4

2 回答 2

8

不要打破一个责任原则:AGrid不应该负责从文件中加载自己,这是另一个组件的责任(例如简单的加载功能):

class Grid
{
public:
    Grid( int ii , int jj , int kk ) : i{ ii } , j{ jj } , k{ kk }
private:
    const int i , j , k;
};

Grid loadGrid( constd std::string& filename )
{
    ...
};
于 2014-08-03T12:51:25.980 回答
3

解决设置具有复杂行为的 const 成员的一种方法是使用 functoin 初始化它们。在您的情况下,如果我理解正确,这些成员是使用一个函数调用初始化的,因此最好该函数只返回成员的值,以便您可以设置 const 成员。应该是这样的:

class Grid
{
  public:
    Grid() : data( readFromInputFile() ) {  }
  private:
    struct Data{
    int i; int j; int k;
    };
    const Data data;
};

这个简单的替代方案应该可以解决您的问题。唯一需要改变的是访问数据的方式,data.i 而不是 i。一旦数据被初始化(readFromInputFile() 也返回一个数据),它就不能被改变。

如果您需要 readFromInputFile() 不是成员或静态成员函数,则将 Data 的定义移到类之外或将其公开。

于 2014-08-03T12:51:17.570 回答