三個類之間的相互調用
由來:在項目開發的時候,定義了三個核心類(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;}
運行結果:
反思:其實完全可以轉嫁為兩個類之間的關係,類多了以後,理清類的單一職責原則,以及類之間的關係,類之間的調用介面很重要!