簡體   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