三個類之間的相互調用
由來:在項目開發的時候,定義了三個核心類(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; }