2013-10-30 68 views
1

我有兩個文件:(C++)碰撞當調用外部類方法在構造函數應該設置內部類的構件

test.h

#ifndef TEST_H_INCLUDED 
#define TEST_H_INCLUDED 
class A{ 
    private: 
    class B; 
    B *bp; 
    public: 
    A(int val); 
    void setX(int value); 
}; 
#endif // TEST_H_INCLUDED 

TEST.CPP

#include "test.h" 

class A::B{ 
    int x; 
    B(A &a, int value){ 
    a.setX(value); 
    } 
    friend class A; 
}; 

A::A(int val) : bp(new B(*this, val)){ 
} 

void A::setX(int value){ 
    bp->x = value; 
} 

雖然試圖創建一個類型爲AI的對象時發生崩潰

A a(5); 

一些調試後,我發現在這行的程序崩潰:

bp->x = value; 

我的猜測是,由於我打電話setX的()從構造函數中,BP沒有在B類的實例指向正在創建。但是,這是怎麼回事?我不想在B構造函數中複製setX()的代碼(這只是一個例子,正如您猜測的那樣,實際代碼更長)。

回答

4

沒有什麼可以做其他然後到A::B的建設從它的初始化分開,以避免這種雞還是先有蛋的問題:

class A::B{ 
    int x; 
    void init(A &a, int value){ 
     a.setX(value); 
    } 
    friend class A; 
}; 

A::A(int val) : bp(new B){ 
    bp->init(*this, val); 
} 
1

雖然丹尼爾的代碼會工作,我會建議使用B中的成員函數。然後,您只需向一個方向(內部),而不是在兩個類之間來回跳動。我不知道;也許這是個人偏好。

class A::B{ 
public: 
    B(int value){ 
    setX(value); 
    } 
    void setX(int value){ 
    x = value; 
    } 
private: 
    int x; 
}; 

A::A(int val) : bp(new B(val)){ 
} 

void A::setX(int value){ 
    bp->setX(value); 
} 
相關問題