この質問は、次の重複と見なされるため終了します。
ただし、他の質問は私のものとは異なります。彼らは別のケースを尋ねており、答えは私の問題では機能しません。彼らの答えは、関数をファイルに入れ、.cpp
宣言する前にクラスを定義することを提案しています。.cpp
私のクラスはテンプレートであるため、関数を入れることができず、既にクラスを定義していますが、役に立ちません。
2 つのヘッダー ファイルa.h
とb.h
. それらには、2 つのテンプレート クラスA
とが定義されていB
ます。
A
必要な機能は、オブジェクトのオブジェクトB
と連携し、その逆も同様です。それらはテンプレートクラスなので、関数をファイルに入れることができず.cpp
、ヘッダーにとどまらなければならず、インクルードの順序に大きな頭痛がします。
この問題を解決するための良い方法論は何ですか?
現在、関数定義を移動し、ヘッダーを正しい順序で含める方法を見つけていますが、これは常により複雑になります。さらに、関数定義がクラス宣言から離れているのは好きではありません (たとえば、他のファイル内)。
コード例:
ああ
#ifndef A_H
#define A_H
#include <iostream>
#include "b.h"
template< typename T > class B;
template< typename T >
class A {
public:
B<void> *b;
void f();
void g();
};
template< typename T > void A<T>::f() {
std::cout << "A::f" << std::endl;
b->f();
}
template< typename T > void A<T>::g() {
std::cout << "A::g" << std::endl;
}
#endif
bh
#ifndef B_H
#define B_H
#include <iostream>
#include "a.h"
template< typename T > class A;
template< typename T >
class B {
public:
A<void> *a;
void f();
void g();
};
template< typename T > void B<T>::f( ) {
std::cout << "B::f" << std::endl;
}
template< typename T > void B<T>::g( ) {
std::cout << "B::g" << std::endl;
a->g();
}
#endif
main.cpp
#include "a.h"
#include "b.h"
int main( ) {
A<void> a;
B<void> b;
a.b = &b;
b.a = &a;
a.f();
b.g();
return 0;
}
a.h
が含まれているため、これは機能しませんb.h
。b.h
その場合は含めることができないため、エラーにa.h
なりB::g
ます。
このサンプル コードでは、 のB::g
中main.cpp
または最後に移動できますa.h
が、より複雑なプログラムの場合、これは簡単ではありません。