来源: http://blog.csdn.net/liunian17/article/details/7318809
要调用一个类中的成员变量或函数,首先要创建一个它的对象或对象指针
这个问题在以前看别人代码的时候看到过类之间的相互调用,但是一直想不通在语法上怎么不会出错。自己试着写一个程序测试了一下。
这里建立两个类。一个是动物,一个是鱼。
1.动物类中有一个成员函数prt(名字我随便取得),函数负责输出:我是动物。
2.然后鱼类的一个成员函数p()调用动物的prt去输出:我是动物。
3.动物类中再用t()去调用鱼的p函数去输出:我是动物。
在main函数中我们分别对动物和鱼实例化一下,分别调用t和p;
不要被绕晕了。
我相信如果只要求完成1.2.两步的话,大家应该都没有什么问题。关键是第三步。
1.增加一个函数prt;
2.去鱼类的头文件中包含动物类的头文件。声明一个动物类的变量。在鱼类的成员函数中用动物类的实例去调用prt;
在第三步时开始的时候一样会不假思索的到动物类的头文件中去包含鱼类的头文件。
但是这一步你就走的太草率了。开始的时候你在鱼类的头文件中已经包含了动物类的头文件,你现在又在动物类的头文件中去包含鱼类头文件。这样相互的头文件包含肯定是个错误。不信你看
头文件的相互包含是错误的,但并不是类相互的调用就是错误的。你可以想一想,这是为什么。类之间的调用其实是实例化之后的调用。比如:动物我实例化一头牛。鱼我实例出两条鱼A,B.牛调用A的一个函数要A替牛喊我是动物。B调用牛去喊我是动物。看上去是类之间的相互调用,其实实例之间的相互调用。A,B在内存中是相互独立的。
但是怎么实例化两条鱼呢?在实例化牛的时候我们直接使调用动物类去声明一个变量,利用构造函数去实例化了。但是在实例化鱼的时候我们却不能这么直接。因为没有鱼类的头文件。那怎么办呢?
1.在动物的头文件中不能包含鱼类的头文件,但是可以在动物的.cpp中去包含。想想这是为什么?
所以你可以这么写:在.cpp中去包含鱼的头文件。然后实例化鱼。调用鱼的函数去喊:我是动物。完成相互调用
2.第一种方法实例化的鱼是一个局部变量。如果我想要一个全局变量的鱼怎么办呢?那只能去头文件中声明了。
你就必须在动物的头文件中这么声明:
class fish;
注意不要写成:class fish{};或者写出它的内部成员数据来。只要像上面这么写就对了。如果你写出了内部函数。编译会出错,说已经重复定义了这个fish。然后定义一个全局变量。但是你是否可以这么定义呢? : fish fi;
这样依旧是错误的。因为这个fish暂时还不是真正的那个可以实例化的鱼。它没有构造函数。所以这里我们用到了指针。你可以这么写:fish *fi。暂时不实例化,等到到.cpp中包含了鱼的头文件的时候在去实例化。比如在动物的构造函数中我们这样:
fi=new fish;这样我们就完成了类之间的相互调用了。