2011-09-23 3 views
6

私はクラス(X)とクラスYの2つのファイルを含むクラス(A)を持っています。残念なことにクラスYはクラスXをヘッダファイルに含める必要があります。引数としてのクラスX型へのポインタ。header guard conundrum - 既に.objの問題で定義されている

潜在的な問題は、リンカーエラーがあるということですか?クラスAにはクラスXのコピーが2つあります。使用する必要があるクラスとクラスYのクラスの2つです。これは、ヘッダーガードが役に立たない状況です。私の質問は - 純粋に構造的な問題かこれを回避する方法があるのか​​?

私は本当にクラスYのヘッダーファイルに何も含めたくないのですが、何かにTHATを含めたい場合は、関数プロトタイプのために必要ですか?

+0

ヘッダファイルに非インライン関数を定義していない限り、これは問題ではありません。いくつかの代表的なコードを投稿できますか? –

+0

実際には申し訳ありませんが、エラーはどこか別の場所から来ていたと思います。しかしそれでも、これは学ぶのは良いことです。ヘッダーファイルにプロトタイプのみが含まれている限り、何も問題なく同じ番号を含めることができます。 – SirYakalot

+1

クラス定義は、メンバ関数の定義とともに、クラス本体自体にインライン展開されている限り、定義することができます(例:class X {int foo(){return 1; }}; '。これは問題ではありません: 'class X {int foo(); }; int X :: foo(){戻り値1; } '。 –

答えて

9

次持ちの場合:

X.h

#ifndef X_H__ 
#define X_H__ 

class X 
{ 
public: 
    int foo() { return 1; } 
}; 

#endif 

Y.hを

#ifndef Y_H__ 
#define Y_H__ 

#include "X.h" 

class Y 
{ 
public: 
    Y(X *pX) { myval = pX->foo(); } 
    int myval; 
}; 

#endif 

something.cpp

#include "X.h" 

... 

something_else.cpp

#include "Y.h" 

... 

そして、問題はないはずです。

X.hではなく、このようになりますただし、:

#ifndef X_H__ 
#define X_H__ 

class X 
{ 
public: 
    int foo(); 
}; 

int X::foo() { return 1; } 

#endif 

あなたはsomething.cppsomething_else.cppをリンクしようとしたとき、あなたは確かにリンカエラーを取得します。 X::fooは、非インラインで2つの別々の翻訳単位に定義されています。

+1

回避策は...? Nooneはクラス内でメソッドを定義したい –

+0

@TomášZato:回避策? 2つのオプションがあります。クラス定義でメンバー関数 "インライン"を定義するか、別の.cppファイルで定義します。 –

+0

これはちょうど私に多くの時間を節約しました。しかし、私はまだ、なぜこれが当てはまるのか分からない。私のコードでは、クラスなしでX.hというファイルがあり、2つのヘルパーメソッドしかありませんでした。今私はそれらを静的にしてクラスに入れ、それが動作します。誰もそれを説明できますか? –

1

Yヘッダーで宣言を使用できます。

class X; 

Xへのポインタのみを使用するため、コンパイラはその定義を知る必要はありません。

+0

これは問題ではありません。 –

関連する問題