2013-06-18 47 views
0

C++我有一個窗口類parent,它創建了多個選項卡窗口child1,child2等等。 父窗口具有每個子窗口的成員變量。我想從child1訪問child2,並認爲我可以在child1的構造函數中將指針傳遞給parent,並使用父指針訪問child2。我甚至不知道如何開始。我試過類似下面的代碼,它不能編譯,從包含(* this)的行開始。將指針傳遞給自己

class CParent 
{ 
public: 
    CParent() {}; 
    CChild1 m_Child1(*this); 
    CChild2 m_Child2; 
    .... 
}; 

class CChild1 
{ 
public: 
    CChild1(CParent *pParent) {}; 
    int getChild2Number(return pParent->m_Child2.m_number); 
}; 

class CChild2 
{ 
public: 
    CChild2() {}; 
    m_number = 1; 
} 

我想知道如果有人能幫助與 1聞聽此事,而不改變其結構過於 2.建議在一個更好的方式來建立這種關係了編譯。

+3

你從哪裏得到這段代碼?你是從頭開始寫的嗎?你爲什麼不通過看書來學習? –

+3

呃,除了別的什麼,你對「這個」的理解是錯誤的。 'this'是一個'CParent *',這是構造函數期望的。你把它解引用,導致一個'CParent',這是錯誤的。 –

+0

作爲一個數據點,你要做的事情就是創建依賴循環(例如'CParent - > CChild1 - > CParent')。將共享狀態放在單獨的課程中並傳遞一個'shared_ptr'給它的每個子類。 –

回答

3

使用兒童的初始化程序列表並通過this。但是請注意,this的某些用途在初始化程序列表中不正確(因爲該對象仍在構建中,並且有些成員尚未初始化)。

如果m_Child1需要使用m_Child2,則應該在類定義中將m_Child2放在m_Child1以上,這樣它將首先被初始化。然後您可以將this指針傳遞給m_Child2這樣的:

struct CParent { 
    CParent() : m_Child1(this) { } 
private: 
    CChild2 m_Child2; 
    CChild1 m_Child1; 
}; 

你可能會考慮通過只是m_Child2m_Child1,雖然,使數據的依賴顯式的,給點提示,爲何m_Child2必須是第一位的,並且不提供正在建設中的對象的參考。這將是這樣的:

struct CChild2; // Forward declare the class so CChild1 can accept it 
struct CChild1 { // Define CChild1 first because CParent uses it for a member 
    CChild1(CChild2 &child2); 
    // ... 
}; 
// ... 
struct CParent { 
    CParent() : m_Child1(m_Child2) { } 
private: 
    CChild2 m_Child2; 
    CChild1 m_Child1; 
}; 
1

你的代碼中有關於聲明和定義的語法,成員初始化等我的建議是保持與C++基礎去了幾次嚴重的問題。

我建議爲您的孩子使用動態存儲,因爲您的問題提示可能存在兩個以上的問題。

class CParent; 

class CChild 
{ 
public: 
    CChild (CParent * p_parent); 
    int get_other_child_number(size_t const other_child); 
    int number (void) { return m_number; } 
private: 
    CParent * m_parent; 
    int m_number; 
}; 

class CParent 
{ 
public: 
    CParent (void) { } 
    void add_child (void) { m_children.emplace_back(this); } 
    CChild & child (size_t const child_num) { return m_children.at(child_num); } 
    CChild const & child (size_t const child_num) const { return m_children.at(child_num); } 
    size_t num_childs (void) const { return m_children.size(); } 
private: 
    std::vector<CChild> m_children; 
}; 

CChild::CChild (CParent * p_parent) : m_parent(p_parent), m_number(p_parent->num_childs()) { } 
int CChild::get_other_child_number(size_t const other_child) 
{ 
    return m_parent->child(other_child).number(); 
} 


int main() 
{ 
    CParent par; 
    par.add_child(); 
    par.add_child(); 
    cout << "Number of Child 0 is " << par.child(0).number() << endl; 
    cout << "Number of Child 1 is " << par.child(1).number() << endl; 
    cout << "Number of Child 0 from Child 1 is " << par.child(1).get_other_child_number(0) << endl; 
    cout << "Number of Child 1 from Child 0 is " << par.child(0).get_other_child_number(1) << endl; 
}