2016-05-30 26 views
0

私は2つのクラスをクラスAとBと呼びましょう。これらのクラスの内部では、関数の引数として参照があります。私はこのようにそれを宣言転送しようとすると:前方宣言クラス、クラスの再定義

// A.h (Header guarded) 
namespace ns { 
    class B { // Attempt to forward declare B 
    public: 
     int getRand(); 
    }; 

    class A { 
    public: 
     float a, b; 

     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A { // Attempt to forward declare A 
    public: 
     float a, b; 
    }; 

    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

事は、私がこれを行うとき、私は'class' type redefinitionエラーが発生しました、です。私は解決策を探していましたが、解決策にはまだ達していません。私はこれを正しくやっていますか?あなたは私がどこに間違っているのか教えていただけますか?

+2

これはあなたがそこに来たわけではありません! 'クラスB;'となります。 – jrok

+0

@jrok hmmしかし、AからBの変数にアクセスする必要がある場合はどうすればよいですか?それがなければ、 'incomplete type is not allowed'というエラーが生成されます。 – Greffin28

+0

これはクラスによって異なります。それらについてもっと教えてください。何を達成したいですか? – jrok

答えて

2

これらは前方宣言ではなく、間違いなく定義されています。

あなたは

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 

    class A { 
    public: 
     // Some functions with B references as arguments   
    }; 
} 

べきで、それはB.hのために同じです。

あなたの状況によると、宣言されたクラスをパラメータとして受け取るメンバー関数がいくつかあります。メンバ関数の宣言を.hファイルに残して、.cppファイルでその定義を提供することができます。など

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 
    class A { 
    public: 
     float a, b; 
     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A; // forward declare A 
    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

// A.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void A::aFunc(B& b) { /* ... */ } 
} 

// B.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void B::bFunc(A& b) { /* ... */ } 
    int B::getRand() { /* ... */ } 
} 
+0

AからBの変数にアクセスする必要がありますか?それがなければ、 'incomplete type is not allowed'というエラーが生成されます。 – Greffin28

+0

@ Greffin28 - オブジェクト指向の設計とカプセル化について再読してください –

+0

@ Greffin28宣言されたクラスをパラメータとして受け取るメンバ関数がいくつかあれば、メンバ関数の宣言を.hファイルに残して、 .cppファイルでのその定義。 – songyuanyao

関連する問題