C++怎么让两个头文件相互包含?

两个类分别声明在两个头文件中,这两个类需要通过【直接】【相互】控制进行协作。【直接】指的是不能使用管理类进行控制;【相互】指的是相互调用对方的方法。因此两个头文件需要相互... 两个类分别声明在两个头文件中,这两个类需要通过【直接】【相互】控制进行协作。【直接】指的是不能使用管理类进行控制;【相互】指的是相互调用对方的方法。因此两个头文件需要相互包含。两个头文件应该怎样写才不会报“重定义”、“未定义标识符”、“无法解析的外部符号”之类的错误?
特别地,如果两个类都是泛型的,由于编译器的原因,类的实现和声明必须都写在头文件中。这种情况下怎样相互包含?
(最好有例子,给出头文件的代码)
展开
 我来答
xpElvis119
推荐于2018-04-27 · 超过22用户采纳过TA的回答
知道答主
回答量:56
采纳率:0%
帮助的人:49.9万
展开全部
  1. 可以通过预处理宏来控制重复包含的问题

  2. 如果是模板类,那么类成员函数声明为内联的即可

 例如
 //A.h
 #pragma once

#include "B.h"

template<typename T> class B; 

template<typename T> class A
{
public:
A(B<T>* b=NULL):b_(b){};

void SetPtr(B<T>* b)
{
b_ = b;
}

void CallFuncFromB()
{
b_->PrintfB();
}

void PrintfA()
{
cout<<"PrintfA"<<endl;
}

public:
B<T>* b_;
};

//B.h
#pragma once

#include "A.h"

template<typename T> class A;

template<typename T> class B
{
public:
B(A<T>* a=NULL):a_(a){}

void SetPtr(A<T>* a)
{
a_ = a;
}

void CallFuncFromA()
{
a_->PrintfA();
}

void PrintfB()
{
cout<<"PrintfB"<<endl;
}

public:
A<T>* a_;
};

//main.cpp
#include <iostream>
#include "A.h"

using namespace std;

int main(int argc, char** argv)
{
A<int> a;
B<int> b;

a.SetPtr(&b);
b.SetPtr(&a);

a.CallFuncFromB();
b.CallFuncFromA();

system("pause");

return 0;
}

//这种方法有一种限值条件,就是模板类A和B的模板参数要求一致。

更多追问追答
追问
用#pragma once会不会导致下列问题:
一个头文件先被执行;然后这个头文件被包含,但是因为#pagma once,里面的声明不会再执行一遍,结果导致“未声明标识符”

内联是指inline吗?为什么内联就行了?
追答
或者你都不include对方的头文件,直接前置声明也一样的

内联就是inline ,为什么要内联这是由于当时C++98标准没有解决这一问题而编译器厂家委婉的一种做法,具体google之。
onekaykay
2014-06-13
知道答主
回答量:3
采纳率:0%
帮助的人:4027
展开全部
互相包含绝对是不行,这会导致包含产生一个类似递归的死循环,既然互相包含不行那么肯定有一方是不可能知道对方的实现细节的,也就不可能通过对象.成员的方式来调用.但是你可以尝试使用回调函数和管理类(已被否决)的方式来解决该问题.
追问
从功能内聚的角度上,两个类都有自己专用的属性和方法。如果使用回调,不就没法把一组[实现相同目标]的功能和它们需要的数据一起封装到一个模块了?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友06bebf5
2015-09-10 · TA获得超过359个赞
知道小有建树答主
回答量:461
采纳率:0%
帮助的人:354万
展开全部
在头文件用下面的宏把代码包起来, 这样可以防止重复。 你说的相互包含,没有问题的啊。

#ifndef _FILENAME_H
#define _FILENAME_H

#endif
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式