簡體   English   中英

主構造函數中子類的初始化-主構造函數主體與子類構造函數主體

[英]Initialization of sub-classes in main constructors - body of main constructor versus sub-class constructor body

我有一些遺留代碼,這些代碼的類包含許多其他子類作為數據成員。 其中大多數將各種輸入讀入子類的數據成員。 看起來像這樣:

MainClass::MainClass(std::string &directory, LogClass &logClass, int mode1, int mode2, int mode3,) : 
    logClass(logClass),                                                                                           
    subClass1(directory, logClass, mode1),                                                  
    subClass2(directory, logClass),                                                                                                                                      
    subClass3(logClass, subClass1, subClass2, mode1, mode2),
    subClass4(logClass, subClass1, subClass2, subClass3, mode1, mode2, mode3),
{
    if(mode2 == 0)                         
    {
        subClass3.init();
    }
    subClass4.init();
}

在某些子類中,初始化發生在其構造函數的主體中。 在其他時候,重要數據成員的初始化發生在mainClass的主體中,如subClass3和subClass4的情況所示。

我正在更改此代碼以包含其他子類,這些子類處理先前讀入的數據的轉換。 這些新類中的某些需要在構造其他類之前對其進行初始化。 例如,如果我添加subClass5,則可能需要運行subClass4.init()。 但是從代碼中可以看出,subClass4.init()不會運行到構造函數的主體。

遵循此前進的良好政策是什么? 我是否應該將所有初始化從子類構造函數中提取到各自的init()函數中,並在主類構造函數中對其進行正確排序? 還是應該將所有初始化都移到子類的構造函數和托盤中並對其進行正確排序?

我正在嘗試找出最適合此問題的代碼設計。

它取決於init()函數的語義 他們在做什么? 他們的構造函數做什么? 為什么要使用兩個不同的函數(構造函數和init )進行初始化?

在我看到的許多代碼中,通常init的功能主要是由於其實現者的特性。 從C ++的角度來看,它們所做的工作屬於構造函數。

另一方面,如果使用init()函數執行與對象構造在語義上不相交的某些事物(例如,啟動計時器,觸發某些事件等),則可能它們與構造函數不相交是好的。 在這種情況下,我將更改其名稱。

諸如init()類的方法有助於將初始化過程委托給以后的時間,並因此可以快速啟動,因為構造函數不必花很多時間進行init() 如果那些init方法正在執行昂貴的操作(如使用密集的CPU周期或獲取昂貴的資源),則尤其如此。

另一方面,如果強加了這樣的協議,則添加subClassX任何人都必須通過調用子類構造函數並在這些子類上調用init來確保正確的初始化。

兩種方法都有優點和缺點,因此選擇完全取決於您。 如果您發現優點多於缺點,那就去吧!

PS當然,這是假定構造函數所做的事情足以使子類實例進入最小可用狀態。

構造函數應始終建立類的不變式,或多或少。 我強烈認為,構造后處於無效狀態且必須使用init()調用進行初始化的類init()

為了進行測試,我考慮將子部件的構造移出類,然后將其提供給構造函數,或者為每個子工廠提供一個工廠。 這使您能夠為子部件創建模擬,並且對於單元測試非常有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM