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 對象,均因為類型大小不確定,編譯器無能為力)。
若需要利用指針或引用調用前置類型的接口,必須按照聲明和實現分離的方式進行編碼。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選