C++ 前置聲明詳解及實例。本站提示廣大學習愛好者:(C++ 前置聲明詳解及實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 前置聲明詳解及實例正文
作者:kaizen
這篇文章主要介紹了C++ 前置聲明詳解及實例的相關資料,需要的朋友可以參考下C++ 前置聲明詳解及實例
【1】一般的前置函數聲明
見過最多的前置函數聲明,基本格式代碼如下:
#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】自定義類型的前置聲明
自定義類型的前置聲明,由於編譯器不知道類型的大小,所以不可以聲明類型的對象。只可以利用類型聲明指針和引用。
代碼如下:
/* * 自定義類型前置聲明 */ #include <iostream> using namespace std; class B; class A { private: // 內置類型 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"); }
如上,利用前置類型的指針想調用其成員函數,會報編譯錯誤!那麼,腫麼辦?請看下文。
【3】聲明和實現分離
代碼如下,聲明頭文件:
/* * TestForwardDeclar.h */ #ifndef D_TESTFORWARDDECLAR_H_ #define D_TESTFORWARDDECLAR_H_ #include <iostream> class B; // 前置聲明自定義類型 class A { private: // 內置類型 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(); // 分開頭文件和實現文件即可 } 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; }
代碼如下:測試文件:
#include "TestForwardDeclar.h" void main() { A objA; }
編譯成功,運行結果是期望效果。
【4】總結
自定義類型前置聲明時,只可以利用類型名聲明指針和引用變量(謹記不可以聲明對象或new 對象,均因為類型大小不確定,編譯器無能為力)。
若需要利用指針或引用調用前置類型的接口,必須按照聲明和實現分離的方式進行編碼。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!