C++多个相互关联的类的声明方法

(一)、假如两个类class A和class B,A聚合(组合)B,B又依赖A,那么该怎么来实现呢?

那么可行的方案:

将类A的声明放在A.h,并在类A前加上一句class B;(类的一种声明方法),这样就能在类A中定义类B的指针或引用(但不能实例化和使用类B的成员及方法),类B的声明放在B.h,并在类B前加上一句class A;,这样就能在类B中定义类A的指针或引用;具体定义分别放到A.CPP和B.CPP中,在两个源文件中都包含A.h和B.h,这样各自的方法中就能使用对方类中的成员和方法了。以下是代码示例:

//A.h
#ifndef __A_h__
#define __A_h__
class B;
class A
{
public:
	A(void);
	~A(void);
	void funcPrint();
	void funcCall();
	B *b;
};
#endif

//B.h
#ifndef __B_h__
#define __B_h__
class A;
class B
{
public:
	void func(A *a);
};
#endif

//A.cpp
#include "A.h"
#include "B.h"
#include <iostream>
A::A(void){b = new B;}
A::~A(void){delete b;}
void A::funcPrint(){
	std::cout <<"test"<<std::endl;
}
void A::funcCall(){
	b->func(this);
}

//B.cpp
#include "A.h"
#include "B.h"
void B::func(A *a){
	a->funcPrint();
}

忌:

假如,A.h中包含了#include "B.h",那么我们不能在B.h中包含#inlcude "A.h",这样会造成包含循环(和重复包含不同,使用了头文件卫士保护也没法避免),编译器将识别不了两个类的声明。

 

(二)、在(一)的的需求再加上,要把类里面方法定义为内联方法(内联类方法,有两种实现方法,但都要求声明和定义放在同一个文件中),那意味着我们不能将类的声明和定义分别放在两个不同的文件中(分开的话,编译器是不允许的),那么该怎么来实现呢?

可行方案①:

将类A和类B的定义和实现都放在一个文件C.h,以下是代码示例:

//C.h
#include <iostream>
class B;
class A
{
public:
	A(void);
	~A(void);
	void funcPrint();
	void funcCall();
	B *b;
};
class B
{
public:
	void func(A *a);
};
A::A(void){b = new B;}
A::~A(void){delete b;}
inline void A::funcPrint(){
	std::cout <<"test"<<std::endl;
}
inline void A::funcCall(){
	b->func(this);
}
inline void B::func(A *a){
	a->funcPrint();
}

可行方案②:

方案①一般针对类位于同一个层次上。如果类有明显的层次关系,那么可以在一个类的声明中内嵌另一个类的声明(即将一个类作为另一个类的内嵌类)(没有层次关系当然也能这么用),以下是代码示例:

/C.h
#include <iostream>
class A
{
public:
	class B
	{
	public:
		void func(A *a){
			a->funcPrint();
		}
	};
	A(void){b = new B;}
	~A(void){delete b;}
	void funcPrint(){
		std::cout <<"test"<<std::endl;
	}
	void funcCall(){
		b->func(this);
	}
	B *b;
};

下面提供一个代码测试函数,对上面的代码都适用:

//test.cpp
#include "A.h"
//#include "C.h"
#include "stdlib.h"
int main()
{
	A a;
	a.funcCall();
	system("pause");
	return 0;
}

原文出处:https://blog.csdn.net/mymagz/article/details/5494642

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您编写一个简单的C++程序,展示多个之间相互调用的过程。下面是代码示例: ```c++ #include <iostream> class ClassB; // 前向声明 // ClassA 定义 class ClassA { public: void callB(ClassB& b); // ClassB 的成员函数调用 void funcA() { std::cout << "ClassA 的成员函数被调用" << std::endl; } }; // ClassB 定义 class ClassB { public: void callA(ClassA& a) { // ClassA 的成员函数调用 a.funcA(); } void callC(); void funcB() { std::cout << "ClassB 的成员函数被调用" << std::endl; } }; // ClassC 定义 class ClassC { public: void callB(ClassB& b) { // ClassB 的成员函数调用 b.funcB(); } void funcC() { std::cout << "ClassC 的成员函数被调用" << std::endl; } }; // ClassB 的成员函数定义 void ClassB::callC() { std::cout << "在 ClassB 的成员函数中调用 ClassC 的成员函数" << std::endl; ClassC c; c.funcC(); } // ClassA 的成员函数定义 void ClassA::callB(ClassB& b) { std::cout << "在 ClassA 的成员函数中调用 ClassB 的成员函数" << std::endl; b.funcB(); } // 主函数 int main() { ClassA a; ClassB b; ClassC c; a.callB(b); // ClassB 的成员函数调用 b.callA(a); // ClassA 的成员函数调用 b.callC(); // ClassC 的成员函数调用 c.callB(b); // ClassB 的成员函数调用 return 0; } ``` 在上面的例子中,我们定义了三个 `ClassA`、`ClassB` 和 `ClassC`,并且在它们的成员函数中相互调用。`ClassA` 中的 `callB()` 函数可以调用 `ClassB` 中的 `funcB()` 函数,而 `ClassB` 中的 `callA()` 函数又可以调用 `ClassA` 中的 `funcA()` 函数。此外,`ClassB` 中的 `callC()` 函数可以创建 `ClassC` 的实例,并调用它的成员函数 `funcC()`,而 `ClassC` 中的 `callB()` 函数又可以调用 `ClassB` 中的 `funcB()` 函数。在 `main()` 函数中,我们创建了 `ClassA`、`ClassB` 和 `ClassC` 的实例,并调用它们的成员函数来相互调用。 希望这个例子能够帮助您理解C++多个之间相互调用的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值