![](/img/trans.png)
[英]How to initialize private members of a class using a friend function in C++?
[英]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.