2012-02-29 51 views
1

我有更多的設計問題。我有一類,說S級,有兩個成員類,P和C P類需要從C類調用成員函數和類P需要調用成員函數從C有沒有對稱設計模式,所以成員類可以指向彼此?

現在我處理的方式這是爲了首先創建C並將它傳遞給P,並反過來使P成爲靜態的,這樣它的成員函數就可以從C中訪問。(以後有可能我會有一個C類的數組,但我會一直有一個P - 這就是爲什麼我可以使它靜態)

我的問題是,有沒有更好的方式來設置呢?我不喜歡讓P變成靜態的 - 理想情況下,我希望C和P彼此指向,但是如何?

一些過度簡化碼被附加。

謝謝!

#include <iostream> 

class C; 

class P { 
    C *c; 
    P (C *x): c(x) {}; 

public: 
    static P *p; 
    static P *get_P(C *x) { if (!p) { p= new P(x);}; return p;}; 
    static P *get_P() { return p;} 

    void P_function(); 
    void P_other(); 
}; 

class C { 
    public: 
    C() {}; 
    void C_function() 
    { 
     std::cout << "in C_funtion\n"; 
    } 
    void C_other() 
    { 
     P::get_P()->P_function(); 
    } 
}; 

void P::P_other() 
{ 
    c->C_function(); 
} 

void P::P_function() 
{ 
    std::cout << "in P_funtion\n"; 
} 

class S { 
    public: 
    C c; 

    S() 
    { 
    P::get_P(&c); 
    }; 
}; 

P* P::p = NULL; 

int main() 
{ 
    S s; 

    s.c.C_other(); 
    P::get_P()->P_other(); 

}

+1

也許你應該問自己,如果這個循環依賴是非常必要的。可能會出現這種情況,但在我看來他們很少。 – Nobody 2012-02-29 18:51:07

回答

2

在你的頭文件,使沒有包括其他類,只有一個向前聲明和使用指針:

// C.h 
#ifndef C_H 
#define C_H 
class P; 

class C 
{ 
    P *p; 
public: 
    C (P *x); 
    // *** no inline implementation of methods calling P methods here!! 
} 
#endif 

同樣做P,但不通過構造函數傳遞C對象,通過單獨的方法將其傳遞到P對象中(以避免在構造兩個對象時出現明顯的雞蛋或雞蛋問題)。

// P.h 
#ifndef P_H 
#define P_H 
class C; 

class P 
{ 
    C *c; 
public: 
    P(); 
    void SetC(C *x){c=x;} 
} 
#endif 

在你的CPP文件,包括C.h在P.cpp和P.h在C.cpp,那麼你可以調用用C P的方法,反之亦然。

現在在你的S類中,首先創建一個P對象,然後創建一個將P對象傳遞給它的C對象,最後通過使用SetC將C對象傳遞給P。

相關問題