繁体   English   中英

使用C ++类中的复杂函数初始化const成员

[英]Initialize const members using complex function in C++ class

我有一个与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,并且仍然能够使用复杂的函数来检索数据? 在我的实际应用程序中,当然还有更多要读取的变量,初始化后不允许更改。

不要违反一个责任原则: Grid不应该负责从文件加载自己,这是另一个组件的责任(例如一个简单的加载函数):

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 )
{
    ...
};

解决具有复杂行为的设置const memebers的一种方法是使用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()不是成员或静态成员函数,那么将数据的定义移到类之外或将其公开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM