加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 头部防护难题 – 已在.obj问题中定义

发布时间:2020-12-16 03:21:21 所属栏目:百科 来源:网络整理
导读:我有一个类(A),它必须包含两个文件,类X和类Y.不幸的是,类Y还需要在它的头文件中包含类X,因为构造函数将一个指向类X类型的指针作为参数. 潜在的问题是会出现链接器错误吗?因为A类现在有两个X类副本,一个需要使用,一个来自Y类.这就是头部保护没用的情况.我的
我有一个类(A),它必须包含两个文件,类X和类Y.不幸的是,类Y还需要在它的头文件中包含类X,因为构造函数将一个指向类X类型的指针作为参数.

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

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

解决方法

如果您有以下内容:

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将被定义为非内联到两个单独的翻译单元.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读