头部保护难题 - 已在.obj问题中定义

时间:2011-09-23 11:18:29

标签: c++

我有一个类(A),它必须包含两个文件,类X和类Y.不幸的是,类Y还需要在它的头文件中包含类X,因为构造函数将一个指向类X类型的指针作为参数。

潜在的问题是会出现链接器错误吗?因为A类现在有两个X类副本,一个需要使用,一个来自Y类。这就是头部保护无用的情况。我的问题是 - 这纯粹是一个结构性问题还是有办法解决这个问题?

我真的不想在Y类的头文件中包含任何内容,以防我想在其他任何内容中包含THAT,但是由于函数原型,它是否必要?

2 个答案:

答案 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.cppsomething_else.cpp时,您确实会收到链接器错误。 X::foo将被定义为非内联到两个单独的翻译单元

答案 1 :(得分:1)

您可以在Y标题中使用声明。

class X;

由于您只使用指向X的指针,编译器不需要知道它的定义。