2014-02-13 265 views
0

我想創建一個類,將成員對象傳遞給它的父對象進行初始化。下面的代碼顯示了我想要做的事情。如何將類的成員對象傳遞給其基類的構造函數?

class TQueueViewerForm1 : public TQueueViewerForm 
{ 
private: // User declarations 
    DOMMsgCollectionEditorImpl m_collection; 
public:  // User declarations 
    __fastcall TQueueViewerForm1(TComponent* Owner); 
}; 

__fastcall TQueueViewerForm1::TQueueViewerForm1(TComponent* Owner) 
    : TQueueViewerForm(Owner, m_collection) 
{ 
} 

但是,這似乎並不奏效。它看起來像構造函數TQueueViewerForm()在m_collection被初始化之前被調用。由於TQueueViewerForm()嘗試使用未初始化的對象,因此這會使程序崩潰。

那麼......我在這裏做了什麼選擇?理想情況下,我想在父類初始化之前初始化m_collection。

回答

0

在孩子的構造函數之前調用派生類的父構造函數總是。你有一個選擇是把你想要執行的初始化代碼放在父類的一個單獨的函數中,並在派生類的構造函數中調用該函數。

1

你必須記住繼承的操作順序。當你構造一個類的實例時,首先構造基礎構件(即你的基類構造函數運行完成);然後,你的類的成員被初始化,最後,你的類的構造函數被運行。

在這種情況下,在初始化之前,你將基本類的隨機內存傳遞給你的基類。

0
class CollectionHolder { 
public: 
    DOMMsgCollectionEditorImpl m_collection; 
}; 

class TQueueViewerForm1 : 
    private CollectionHolder, // important: must come first 
    public TQueueViewerForm { 
}; 

有點太微妙,我的口味。就我個人而言,我試圖找到一個不需要我去執行這樣的體操的設計。

+0

哦,哇。這將解決這個問題,但我不認爲我可以原諒自己寫這種代碼... – QuestionC

+0

同意。這看起來過於複雜,並且可能不值得爲不熟悉代碼庫的新維護人員進行維護。最好重新考慮問題並嘗試不同的方法。 – jia103

0

您可以使用派生類構造函數的初始化列表將參數傳遞給基類構造函數。

class Parent 
{ 
public: 
    Parent(std::string name) 
    { 
     _name = name; 
    } 

    std::string getName() const 
    { 
     return _name; 
    } 

private: 
    std::string _name; 
}; 

// 
// Derived inherits from Parent 
// 
class Derived : public Parent 
{ 
public: 
    // 
    // Pass name to the Parent constructor 
    // 
    Derived(std::string name) : 
    Parent(name) 
    { 
    } 
}; 

void main() 
{ 
    Derived object("Derived"); 

    std::cout << object.getName() << std::endl; // Prints "Derived" 
} 
相關問題