我有一个类(A),它必须包含两个文件,类X和类Y.不幸的是,类Y还需要在它的头文件中包含类X,因为构造函数将一个指向类X类型的指针作为参数。
潜在的问题是会出现链接器错误吗?因为A类现在有两个X类副本,一个需要使用,一个来自Y类。这就是头部保护无用的情况。我的问题是 - 这纯粹是一个结构性问题还是有办法解决这个问题?
我真的不想在Y类的头文件中包含任何内容,以防我想在其他任何内容中包含THAT,但是由于函数原型,它是否必要?
答案 0 :(得分:10)
如果您有以下内容:
<强> 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.cpp
和something_else.cpp
时,您确实会收到链接器错误。 X::foo
将被定义为非内联到两个单独的翻译单元。
答案 1 :(得分:1)
您可以在Y标题中使用声明。
class X;
由于您只使用指向X的指针,编译器不需要知道它的定义。