2016-03-16 145 views
1

我正在用C++ 11編寫我的程序。我有一個名爲MyExperiment的主類。在這個類中還有另一個類,ReadFromFile,它從文件中讀出一些關於設置的信息。然後,我想使用這些數據來初始化一些其他對象,這些對象是類別爲MyExperiment類的成員。這是應該的樣子:哪種設計模式適合這種情況?

class MyExperiment 
{ 
    FirstObject *firstObject; 
    SecondObject *secondObject; 
public: 
    MyExperiment() 
    { 
     ReadFromAFile readfromafile; 
     readfromafile.read(); 
     firstObject = new FirstObject(/*some data from the readfromafile object */); 
     secondObject = new SecondObject(/*some data from the readfromafile object */); 
    } 
} 

每個對象firstObjectsecondObject)類包含的一些信息,可以(也應該)被從文件和其他一些變量的讀出和功能。我真的不要想要爲每個對象類型有兩個類:一個用於可以從文件中讀取的數據,另一個用於其餘的。

所以,我想使用ReadFromFile類從文件讀取一些信息,然後以某種方式將信息傳遞給我的對象的構造者。我的問題是:什麼是正確的做法?

現在我有一些結構描述我從ReadFromFile類的文件中讀取的數據。每個結構都指向一個對象。我也有干將對其調用在MyExperiment類的構造函數:

class MyExperiment 
{ 
    FirstObject *firstObject; 
    SecondObject *secondObject; 
public: 
    MyExperiment() 
    { 
     ReadFromAFile readfromafile; 
     readfromafile.read(); 
     firstObject = new FirstObject(readfromafile.getFirstStruct()); 
     secondObject = new SecondObject(readfromafile.getSecondStruct()); 
    } 
} 

我不認爲這個解決方案是優雅和智能。我有一個描述我的firstObject的結構,然後使用它作爲這個對象的構造函數。

我不知道如何以更好的方式做到這一點,所以我會很感激任何評論。

我不想讀取我的myExperiment類中的文件,因爲它已經很複雜,所以我需要一些enacpsulation。

是否有解決此問題的方法?

+0

很難說不知道更多,但我會考慮消除ReadFromFile,並將該功能直接放入第一個和第二個對象。只是我的兩分錢... –

回答

3

MyExperiment不依賴於文件。它取決於FirstObjectSecondObject;有它的構造反映:

class MyExperiment { 
    public: 
    MyExperiment(FirstObject fo, SecondObject so) 
    : fo(fo), so(so) { } 
    private: 
    FirstObject fo; 
    SecondObject so; 
}; 

現在你已刪除MyExperiment以及其中FirstSecond對象讀取方式之間的依賴關係。

現在您可以創建一些工廠功能。例如,若要從一個文件中的一個實驗中,你可以做這樣的事情:

MyExperiment make_experiment(std::string file) { 
ReadFromAFile stuff(file); 
return MyExperiment(stuff.fist_object(), stuff.second_object()); 
} 

最後,ReadFromAFile是一類可怕的名字。可能你的意思是FileReader(可能是一個更通用的DataSource基類的子類)。一般來說,類名應該是名詞,它的方法應該是動詞。當然,您可以隨意命名。但是,指南確實可以幫助您形成一個定義良好的系統思維模型。

+0

@Nacho謝謝。完成。 – Escualo

1

在我看來,你想要一個Factory。爲了不重複自己落「結構」,你可以讓你的閱讀器類中添加構造對象,這樣

firstObject = readfromafile.NewFirstObject(); 
secondObject = readfromafile.NewSecondObject(); 

然後你可以聲明讀者FirstObject的和SecondObject的朋友,使它們的構造私有的,但實際上並不是必需的。

0

如果你真的不想定義單獨的類和(我假設)你有幾個初始化策略,那麼我寧願做一個構造函數,它需要一個枚舉來選擇初始化策略,如:

typedef enum _Strategy 
{ 
    STRATEGY_A = 1, 
    STRATEGY_B 
} 

class MyExperiment 
{ 
    FirstObject *firstObject; 
    SecondObject *secondObject; 
    public: 
     MyExperiment() 
     { 
      firstObject = new FirstObject(STRATEGY_A); 
      secondObject = new SecondObject(STRATEGY_B); 
    } 
} 

並根據給定的策略做文件讀取和初始化爲@H。古吉特在他的評論中寫道。

相關問題