C++ 前置声明详解及实例
2017-06-05 08:47
615 查看
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 对象,均因为类型大小不确定,编译器无能为力)。
若需要利用指针或引用调用前置类型的接口,必须按照声明和实现分离的方式进行编码。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
相关文章推荐
- 【C/C++开发】C++之enum枚举量声明、定义、使用与枚举类详解与枚举类前置类型声明
- C++的前置声明详解
- C++中头文件中是包含include还是包含类的前置声明
- strcpy没有声明 c++头文件详解
- c++ 之类的前置声明
- C++中const关键字用法详解及实例和源码下载(一)
- 实例详解C/C++中extern关键字
- C++ 初始化列表详解及实例代码
- Caffemodel数据结构解析与Protocol Buffer技术详解(C++实例)
- C/C++ 二维数据 静态动态声明和初始化及访问方法实例
- C++单例模式的实例详解
- C++中头文件中是包含include还是包含类的前置声明
- c++ 前置声明
- C++中回调函数及函数指针的实例详解
- C++ 前置声明和include引起的问题
- 【C++基础】C++之类的前置声明
- C++中的前置声明(Forward Declaration)
- 关于C++中的前置声明
- 为什么我们要使用c++的前置声明
- c++中类的前置声明