C++前置声明
【1】一般的前置函数声明
见过最多的前置函数声明,基本格式代码如下:
#include <iostream>
using namespace std; void fun(char ch, int *pValue, double dValue); void main()
{
int nValue = ;
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()
, 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 = ) : 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 = );
~B ();
void doAnything();
}; #endif
代码如下,定义文件:
/*
* TestForwardDeclar.cpp
*/ #include "TestForwardDeclar.h"
#include <iostream> A::A (B *pBPara)
: m_nInt()
, 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 对象,均因为类型大小不确定,编译器无能为力)。
若需要利用指针或引用调用前置类型的接口,必须按照声明和实现分离的方式进行编码。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
C++前置声明的更多相关文章
- C++ 类的前置声明
http://www.2cto.com/kf/201311/260705.html 今天在研究C++”接口与实现分离“的时候遇到了一个问题,看似很小,然后背后的东西确值得让人深思!感觉在学习的过 ...
- C++中头文件相互包含与前置声明
一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题.假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中, ...
- C++ 前置声明 和 包含头文件 如何选择
假设有一个Date类 Date.h class Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法 其一 Task1 ...
- C++_前置声明
为什么要有前置声明? eg: -定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样: //a.h #include "b. ...
- 关于C++中的前置声明(附程序运行图)
实验于华中农业大学逸夫楼2017.3.10 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中 ...
- C++ 类声明 类前置声明范例
转载自http://www.cnblogs.com/staring-hxs/p/3244251.html 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的 ...
- 【C++】类前置声明范例
• 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面 ...
- C++中前置声明介绍
前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...
- c++中的前置声明
引用google c++编码规范: When you include a header file you introduce a dependency that will cause your cod ...
随机推荐
- jQuery -- 监听input、textarea输入框值变化
$('textarea').bind('input propertychange', function(){ if($(".textareachange").val() != &q ...
- 用Eclipse构建Maven项目
Eclipse中m2eclipse插件的安装 Help>Install New Software Click Add Name: m2e Location: http://download.ec ...
- 七、Spring Boot 启动配置原理
几个重要的事件回调机制 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunListener ...
- 对CountDownLatch的初步学习
CountDownLatch的中文翻译为"闭锁",在JDK1.5中 CountDownLatch类加入进来.为程序猿进行并发编程提供有利的帮助. 首先我们先看看JDK文档中对于Co ...
- 帝国cms添加修改会员字段时字段名不能带数字,否则注册页会出现空白
这几天ytkah在整帝国cms会员模块,根据客户需求添加不同的字段,这个相对不难,可还是遇到了点问题.当时添加会员字段时,在字段名用数字“1”来代表第一次,如下图的字段名“1rwsdy” 但是添加以后 ...
- awk命令的基本使用
命令主要用法 -格式1:前置命令 | awk [选项] '[条件]{编辑指令}' -格式2:awk [选项] '[条件]{编辑指令}' filename 常用命令选项 -F:指定分隔符,可省略(默认空 ...
- shell进阶函数
函数的定义和用途 函数function是由若干条shell命令组成的语句块,实现shell代码的重用和模块化编程. 函数和shell程序的异同点 它与shell程序形式上是相似的,不同的是它不是一个单 ...
- javaBean转为json
一个测试用例 javabean转json @Test @Rollback(false) public void policyQueryTest() throws Exception { // 查询数据 ...
- UML序列图的理解:
UML序列图的理解:UML序列图是指一个对象的方法在处理过程中调用其他对象的图:重点是要突出调用其他对象的序列:
- python list成员函数extend与append的区别
extend 原文解释,是以list中元素形式加入到列表中 extend list by appending elements from the iterable append(obj) 是将整个ob ...