C++ 前置声明详解及实例
【1】一般的前置函数声明
见过最多的前置函数声明,基本格式代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#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】自定义类型的前置声明
自定义类型的前置声明,由于编译器不知道类型的大小,所以不可以声明类型的对象。只可以利用类型声明指针和引用。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
/* * 自定义类型前置声明 */ #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】声明和实现分离
代码如下,声明头文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/* * 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 |
代码如下,定义文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/* * 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; } |
代码如下:测试文件:
1
2
3
4
5
6
|
#include "TestForwardDeclar.h" void main() { A objA; } |
编译成功,运行结果是期望效果。
【4】总结
自定义类型前置声明时,只可以利用类型名声明指针和引用变量(谨记不可以声明对象或new 对象,均因为类型大小不确定,编译器无能为力)。
若需要利用指针或引用调用前置类型的接口,必须按照声明和实现分离的方式进行编码。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://www.cnblogs.com/Braveliu/p/6653941.html