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 對象,均因為類型大小不確定,編譯器無能為力)。
若需要利用指針或引用調用前置類型的接口,必須按照聲明和實現分離的方式進行編碼。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章
- 04-02c語言沒有round函數 round c語言
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現與遞歸實現的方法(C++)
- 01-10C++大數模板(推薦)
- 01-10淺談C/C++中的static與extern關鍵字的使用詳解
- 01-10深入C/C++浮點數在內存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 01-11ajax實現頁面的局部加載
- 01-10C#中split用法實例總結
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什