三個類之間的相互調用實現

來源:互聯網
上載者:User

                                                         三個類之間的相互調用

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

   運行結果:

             

  

       反思:其實完全可以轉嫁為兩個類之間的關係,類多了以後,理清類的單一職責原則,以及類之間的關係,類之間的調用介面很重要!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.