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

2024年11月16日 07:52
有3个网友回答
网友(1):

  1. 可以通过预处理宏来控制重复包含的问题

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

 例如
 //A.h
 #pragma once

#include "B.h"

template class B; 

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

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

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

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

public:
B* b_;
};

//B.h
#pragma once

#include "A.h"

template class A;

template class B
{
public:
B(A* a=NULL):a_(a){}

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

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

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

public:
A* a_;
};

//main.cpp
#include 
#include "A.h"

using namespace std;

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

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

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

system("pause");

return 0;
}

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

网友(2):

互相包含绝对是不行,这会导致包含产生一个类似递归的死循环,既然互相包含不行那么肯定有一方是不可能知道对方的实现细节的,也就不可能通过对象.成员的方式来调用.但是你可以尝试使用回调函数和管理类(已被否决)的方式来解决该问题.

网友(3):

在头文件用下面的宏把代码包起来, 这样可以防止重复。 你说的相互包含,没有问题的啊。

#ifndef _FILENAME_H
#define _FILENAME_H

#endif