2012-09-30 28 views
3

我想要一個C++類,它從包含一堆數據的文件中初始化,讀取數據並將其存儲爲const數據成員。一些數據成員的常量初始化

我目前做的是

MyClass(const std::string & fileName): 
datum0(), 
datum1(), 
datum2() 
{ 
    this->read(fileName); 
    // read() sets all datumX data members. 
} 

這具有datumX s不能再被因爲它們實際的初始化步驟後成立標誌着const的缺點。

這裏會是什麼樣的好模式?

+0

'const'數據成員在C++中很少是個好主意。例如,它們將阻止你將'MyClass'對象放入'std :: vector'中。 – fredoverflow

回答

1

而不是一組datumX成員 - 使用結構與這些成員有文件的構造函數。使您的類的這個結構常數數據成員:

class MyClass { 
    ... 
    struct MyData { 
    MyData(const string& filename) { read(filename); } 
    void read(const string& filename); 
    int datum1; 
    int datum2; 
    ... 
    }; 
    const MyData myData; 
    MyClass(const string& filename) : myData(filename) {} 
}; 
+1

這沒有幫助。 'MyClass'構造函數必須調用'myData.read'來設置'datum1'等。這意味着'MyData :: read'需要是'const',或'myData'不需要'const'。另外,'filename'可能只應該是MyData :: MyData或MyData :: read的參數,但不能同時使用。 – Fraser

+0

@Fraser--它不是MyClass調用read(),而是MyData調用read()。我認爲這是顯而易見的 - 只是更新以明確。這是(-1)的原因? – PiotrNycz

+0

是的。這並不明顯。這將是如果你從編輯後刪除'讀'私人;-) -1。 – Fraser

2

獨立解析和構造:

struct MyClass 
{ 
    int const a; 
    int const b; 

    MyClass(int a_, int b_) : a(a_), b(b_) { } 
}; 

MyClass readMyClass(std::istream & is) 
{ 
    int a, b; 

    // ... 

    return MyClass(a, b); 
} 

現在,你可以說:

std::ifstream is("data.bin"); 
MyClass mc = readMyClass(is); 

您也可以使讀者功能如果您願意,可以使用static類成員函數和構造函數private