我有一个类(A),它必须包含两个文件,类X和类Y.不幸的是,类Y还需要在它的头文件中包含类X,因为构造函数将一个指向类X类型的指针作为参数.
潜在的问题是会出现链接器错误吗?因为A类现在有两个X类副本,一个需要使用,一个来自Y类.这就是头部保护没用的情况.我的问题是 – 这纯粹是一个结构性问题还是有办法解决这个问题?
解决方法
如果您有以下内容:
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将被定义为非内联到两个单独的翻译单元.