2012-02-29 6 views
1

私には、設計上の疑問があります。私は、クラスを持つ2つのメンバクラスを持つクラスSを、言う、PとCクラスPはクラスCからのメンバ関数を呼び出す必要があるとクラスPは今C.symetricalデザインパターンがあるので、メンバークラスは相互にポインターを持つことができますか?

からメンバ関数を呼び出すために私が対処方法を必要としますこれは最初にCを作成してPに渡し、次にPの静的にして、そのメンバー関数にCからアクセスできるようにしています(後で私はCクラスの配列を持つ可能性がありますが、 1つの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

答えて

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オブジェクトに渡します(2つのオブジェクトを構築するときの明らかな卵または卵の問題を回避するため)。あなたのCPPファイルで

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

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

、C.cppでP.cppとP.hでC.hは、その後、あなたがCにPのメソッドを呼び出すと、その逆のことができます。

クラスSでは、まずPオブジェクトを作成し、次にPオブジェクトを渡してCオブジェクトを作成し、最後にSetCを使用してCオブジェクトをPに渡します。

関連する問題