交叉引用的问题

zy416548283 2014-10-29 01:02:41
参考帖子: http://blog.csdn.net/jmy5945hh/article/details/22911615

a.h:

#ifndef CLASS_A_H
#define CLASS_A_H

#include "b.h"
class B;
class A
{
public:
void InvokeB()
{
B *b;
b->Print();
}

void Print()
{
std::cout << "This is class A\n";
}

//B *b;
};

#endif


b.h

#ifndef CLASS_B_H
#define CLASS_B_H

#include "a.h"
class A;

class B
{
public:
void InvokeA()
{
A *a;
a->Print();
}

void Print()
{
std::cout << "This is class B\n";
}

// A *a;
};

#endif


main.cpp

#include <iostream>

#include "a.h"
#include "b.h"

int main()
{
A aa;
aa.InvokeB();

//B bb;
//bb.a->Print();
}


编译运行报错:

In file included from a.h:4:0,
from main.cpp:3:
b.h: In member function ‘void B::InvokeA()’:
b.h:13:6: error: invalid use of incomplete type ‘class A’
a->Print();
^
b.h:5:7: error: forward declaration of ‘class A’
class A;
^

为啥为报错A类未完成的错误呢?
还有原作者提的解决方案,为啥就可以运行呢?
...全文
500 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhao_test_123 2014-10-30
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
你现在是main开头包含a,a开头包含b,b开头再包含a,但是b包含a的这个步骤CLASS_A_H已经定义过了因此不会展开,所以b里实际是没有a的定义的,所以b在用a的时候incomplete type。 解决办法是a.h b.h的include删掉,InvokeA, InvokeB的定义移到main.cpp或者其他cpp里。
恩,理解了,好像关键点在于在使用函数之前,必须能够找到函数的定义或者声明. 像你们提到的将头文件和源文件分开都是不错的解决方案. 我用一个文件来写,解决了这个问题:

#include<iostream>
class A
{
	public:
	void InvokeB();
	
	void Print()
	{
		std::cout << "this is class A" << std::endl;
	}
};
class B
{
	public:
	void InvokeA();
	
	void Print()
	{
		std::cout << "this is class B" << std::endl;
	}
};

void A::InvokeB()
{
	B *b;
	b->Print();
}

void B::InvokeA()
{
	A *a;
	a->Print();
}


int main()
{
	A aa;
	aa.InvokeB();
}

非常感谢你们的解答!!!
  • 打赏
  • 举报
回复
记住只在cpp中引用.h就行
勤奋的小游侠 2014-10-29
  • 打赏
  • 举报
回复
将各个include a和b去掉。添加一二个a.cpp和b.cpp。将实现移到cpp文件。只要cpp里面引用头文件,不要在头文件引用头文件。
FancyMouse 2014-10-29
  • 打赏
  • 举报
回复
你现在是main开头包含a,a开头包含b,b开头再包含a,但是b包含a的这个步骤CLASS_A_H已经定义过了因此不会展开,所以b里实际是没有a的定义的,所以b在用a的时候incomplete type。 解决办法是a.h b.h的include删掉,InvokeA, InvokeB的定义移到main.cpp或者其他cpp里。
zhao_test_123 2014-10-29
  • 打赏
  • 举报
回复
编译这些搞的自己稀里糊涂的,球高手指点~ 一般不提倡交叉引用,那么要怎么避免呢?

65,179

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧