三个类之间的相互调用实现

简介: 由来:在项目开发的时候,定义了三个核心类(ClassA,ClassB, ClassC),三个类之间存在调用关系如下:ClassC是管理类,需要调用ClassA, ClassB的接口;同时作为被管理类,ClassA, ClassB需要又需要调用ClassC的接口。

   理清楚三类之间的关系:


      1)定义顺序:ClassA, ClassB先于ClassC。


      2)调用关系:ClassC要调用ClassA的接口、ClassB的接口;ClassA要调用ClassC的接口,classB要调用ClassC的接口。


      其实,理清楚1),2)后我们发现,ClassA与ClassB之间并无直接调用关系(如果可以复杂点的话,可以再加处理)。


      核心点:两个类需要相互调用对端类的接口时,需要主要包含对方头文件及前向声明的问题,这个网上都有不少网友解答。举例上面ClassA与ClassC的关系如下:


       第一步:定义ClassA.h , classA.cpp , ClassC.h ClassC.cpp;


       第二步:在ClassC.h头文件加上 #include “ClassA.h”, 在ClassC的cpp文件中加上#include “ClassC.h”;


       第三步:在ClassA.h头文件中加上 #include “ClassA.h”, 在ClassA的cpp文件中加上 #include “ClassA.h” , #include “ClassC.h”。


       上面的不清楚的话,详见实践代码:


        代码实现:


/*

**ClassA.h

*/

#ifndefCLASSA_H_H

#defineCLASSA_H_H

classClassC;

classClassA

{

public:

      ClassA(ClassC* pC);

      ClassA();

      ~ClassA();

public:

      void displayA();

      void invoke_classC_in_ClassA();

public:

      ClassC* m_pC;

};

#endif

/*

**ClassA.cpp

*/

#include"stdafx.h"

#include"ClassA.h"

#include"classC.h"

#include<iostream>

usingnamespace std;

ClassA::ClassA(ClassC*pC)

{

      cout << "ClassA(ClassC* pC)constructor is running!" << endl;

      m_pC = pC;

}

ClassA::ClassA()

{

      cout << "ClassA() constructoris running!" << endl;

   

}

ClassA::~ClassA()

{

      cout << "ClassA destructor isrunning!" << endl;

}

voidClassA::invoke_classC_in_ClassA()

{

      cout <<"ClassA::invoke_classC_in_ClassA() is running" << endl;

      m_pC->displayC();

}

voidClassA::displayA()

{

      cout << "classA::displayA() isrunning!" << endl;

}

/*

**ClassB.h

*/

#ifndefCLASSB_H_H

#defineCLASSB_H_H

classClassC;

classClassB

{

public:

      ClassB(ClassC* pC);

      ClassB();

      ~ClassB();

public:

      void displayB();

      void invoke_classC_in_ClassB();

public:

      ClassC* m_pC;

};

#endif

/*

**ClassB.cpp

*/

#include"stdafx.h"

#include"ClassB.h"

#include"classC.h"

#include<iostream>

usingnamespace std;

ClassB::ClassB(ClassC*pC)

{

      cout << "ClassB(ClassC* pC)constructor is running!" << endl;

      m_pC = pC;

}

ClassB::ClassB()

{

      cout << "ClassB() constructoris running!" << endl;

   

}

ClassB::~ClassB()

{

      cout << "ClassB destructor isrunning!" << endl;

}

voidClassB::displayB()

{

      cout << "ClassB::displayB() isrunning!" << endl;

}

voidClassB::invoke_classC_in_ClassB()

{

      cout <<"ClassB::invoke_classC_in_ClassB() is running!" << endl;

      m_pC->displayC();

}

/*

**ClassC.h

*/

#ifndefCLASSC_H_H

#defineCLASSC_H_H

#include"ClassA.h"

#include"ClassB.h"

classClassC

{

public:

      ClassC();

      ~ClassC();

public:

      void displayC();

      void invoke_ClassA_in_ClassC();

      void invoke_ClassB_in_ClassC();

public:

      ClassA* m_pA;

      ClassB* m_pB;

};

#endif

/*

**ClassC.cpp

*/

#include"stdafx.h"

#include"ClassC.h"

#include<iostream>

usingnamespace std;

ClassC::ClassC()

{

      cout << "ClassC() constructoris running!" << endl;

      m_pA = new ClassA();

      m_pB = new ClassB();

   

}

ClassC::~ClassC()

{

      cout << "ClassC destructor isrunning!" << endl;

      if(NULL != m_pA)

      {

             delete m_pA;

             m_pA = NULL;

      }

      if(NULL != m_pB)

      {

             delete m_pB;

             m_pB = NULL;

      }

}

voidClassC::displayC()

{

      cout << "ClassC::displayC() isrunning!" << endl;

}

voidClassC::invoke_ClassA_in_ClassC()

{

      cout <<"ClassC::invoke_ClassA_in_ClassC() is running!" << endl;

      m_pA->displayA();

}

voidClassC::invoke_ClassB_in_ClassC()

{

      cout <<"ClassC::invoke_ClassB_in_ClassC() is running!" << endl;

      m_pB->displayB();

}

/*

**main.cpp

*/

#include"stdafx.h"

#include"ClassA.h"

#include"ClassB.h"

#include"ClassC.h"

#include<iostream>

using namespacestd;

intmain(int argc, char* argv[])

{

      ClassC* pC = new ClassC;

      cout << "C类调用A类:" << endl;

      pC->invoke_ClassA_in_ClassC();

      cout << endl << "C类调用B类:" << endl;

      pC->invoke_ClassB_in_ClassC();

      cout << endl << "A类调用C类:" << endl;

      ClassA* pA = new ClassA(pC);

      pA->invoke_classC_in_ClassA();

      cout << endl << "B类调用C类:" << endl;

      ClassB* pB = new ClassB(pC);

      pB->invoke_classC_in_ClassB();

      cout << endl;

   delete pB;

      delete pA;

      delete pC;

      return 0;

}

  运行结果:

image.png

反思:其实完全可以转嫁为两个类之间的关系,类多了以后,理清类的单一职责原则,以及类之间的关系,类之间的调用接口很重要!

相关文章
|
6月前
|
设计模式
|
6月前
|
设计模式
抽象工厂和原型设计模式之间的区别
【8月更文挑战第22天】
53 0
|
6月前
|
安全 前端开发 Java
|
9月前
|
存储 编译器 C语言
C与C++之间相互调用的基本方法
C与C++之间相互调用的基本方法
161 1
|
设计模式
设计模式中的六种关系以及代码之间的对应
设计模式中的六种关系以及代码之间的对应
183 0
设计模式中的六种关系以及代码之间的对应
|
Java
类之间的比较
类之间的比较
86 0
|
编译器 测试技术 C语言
C与C++之间的相互调用及函数区别
最近项目需要使用google test(以下简称为gtest)作为单元测试框架,但是项目本身过于庞大,main函数无从找起,需要将gtest框架编译成静态库使用。因为项目本身是通过纯c语言编写,而gtest则是一个c++编写的测试框架,其中必然涉及c与c++之间的相互调用。 注意,本文的前提是,c代码采用gcc等c语言编译器编译c代码,采用g++等c++编译器编译c++代码,如果c和c++代码统一使用g++编译,大部分情况是可以实现两者代码相互调用的。以下为踩坑过程的总结o_O||。 c与c++的函数区别 要了解两者之间如何实现相互调用,必须先了解c与c++之间的函数有什么不同。 c+
142 0
|
存储
对象之间的耦合性
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/8962836   数据耦合 数据耦合指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言的值传递. 一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。
1276 0
接口vs抽象类、继承vs组合,他们之间有啥关系
接口vs抽象类、继承vs组合,他们之间有啥关系
普通类,抽象类和接口之间的区别
普通类,抽象类和接口之间的区别