您好,登錄后才能下訂單哦!
C++ 前置聲明詳解及實(shí)例
【1】一般的前置函數(shù)聲明
見過最多的前置函數(shù)聲明,基本格式代碼如下:
#include <iostream> using namespace std; void fun(char ch, int *pValue, double dValue); void main() { int nValue = 100; double dValue = 111.22; fun('a', &nValue, dValue); system("pause"); } void fun(char ch, int *pValue, double dValue) { return; }
很好理解,不做贅述。
【2】自定義類型的前置聲明
自定義類型的前置聲明,由于編譯器不知道類型的大小,所以不可以聲明類型的對(duì)象。只可以利用類型聲明指針和引用。
代碼如下:
/* * 自定義類型前置聲明 */ #include <iostream> using namespace std; class B; class A { private: // 內(nèi)置類型 int m_nInt; int& m_nRInt; int* m_pInt; // 自定義類型 // B b; // error! B* m_pB; B& m_b; public: A (B *pBPara = NULL) : m_nInt(100) , m_nRInt(m_nInt) , m_pInt(NULL) , m_pB(NULL) , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara)) { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void funA() { // m_pB->doAnything(); // build error C2027: use of undefined type 'B' } }; class B { private: int m_n; public: B (int n = 100) : m_n(n) { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; } void doAnything() { cout << "B::anythig()" << endl; } }; void main() { A objA; system("pause"); }
如上,利用前置類型的指針想調(diào)用其成員函數(shù),會(huì)報(bào)編譯錯(cuò)誤!那么,腫么辦?請(qǐng)看下文。
【3】聲明和實(shí)現(xiàn)分離
代碼如下,聲明頭文件:
/* * TestForwardDeclar.h */ #ifndef D_TESTFORWARDDECLAR_H_ #define D_TESTFORWARDDECLAR_H_ #include <iostream> class B; // 前置聲明自定義類型 class A { private: // 內(nèi)置類型 int m_nInt; int& m_nRInt; int* m_pInt; // 自定義類型 // B b; // error! B* m_pB; B& m_b; public: A (B *pBPara = NULL); ~A (); void funA(); }; class B { private: int m_n; public: B (int n = 100); ~B (); void doAnything(); }; #endif
代碼如下,定義文件:
/* * TestForwardDeclar.cpp */ #include "TestForwardDeclar.h" #include <iostream> A::A (B *pBPara) : m_nInt(100) , m_nRInt(m_nInt) , m_pInt(NULL) , m_pB(NULL) , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara)) { std::cout << "A()" << std::endl; } A::~A() { std::cout << "~A()" << std::endl; } void A::funA() { m_pB->doAnything(); // 分開頭文件和實(shí)現(xiàn)文件即可 } B::B (int n) : m_n(n) { std::cout << "B()" << std::endl; } B::~B() { std::cout << "~B()" << std::endl; } void B::doAnything() { std::cout << "B::anythig()" << std::endl; }
代碼如下:測(cè)試文件:
#include "TestForwardDeclar.h" void main() { A objA; }
編譯成功,運(yùn)行結(jié)果是期望效果。
【4】總結(jié)
自定義類型前置聲明時(shí),只可以利用類型名聲明指針和引用變量(謹(jǐn)記不可以聲明對(duì)象或new 對(duì)象,均因?yàn)轭愋痛笮〔淮_定,編譯器無能為力)。
若需要利用指針或引用調(diào)用前置類型的接口,必須按照聲明和實(shí)現(xiàn)分離的方式進(jìn)行編碼。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。