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 ...
随机推荐
- linux strtock()函数使用问题
strtok()原型:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成一个个片段.参数s 指向欲分割的字符串,参数de ...
- [GDOI2018]滑稽子图
题目链接:[被和谐] 题目大意:对于一棵树$(V,E)$,对于$S\subset V$,$f(S)$为点集$S$的导出子图的边数.求$\sum_{S\subset V}f(S)^k$ 这里的导出子图说 ...
- SpringBoot-整合lombok
添加lombok依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lom ...
- (3.15)mysql基础深入——mysql默认数据库/系统数据库
(3.15)mysql基础深入——mysql默认数据库 关键词:Mysql默认数据库,mysql系统数据库 系统数据库的组成 一共4个 [1]information_schema(可以理解成字典表) ...
- what's the 场外交易
出自 MBA智库百科(https://wiki.mbalib.com/) 什么是场外交易 场外交易是指证券投资机构之间不通过股票交易所,而以电话.电传等方式相互进行的股票交易. ...
- Python3学习之路~5.8 shelve模块
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式 import shelve import datetime name = [& ...
- 2 jmeter常用功能介绍-测试计划、线程组
1.测试计划测试用来描述一个性能测试,所有内容都是基于这个测试计划的. (1)User Defined Variables:设置用户全局变量.一般添加一些系统常用的配置.如果测试过程中想切换环境,切换 ...
- CentOS里alias命令
alias命令 功能描述:我们在进行系统的管理工作一定会有一些我们经常固定使用,但又很长的命令.那我们可以给这些这一长串的命令起一个别名.之后还需要这一长串命令时就可以直接以别名来替代了.系统中已经有 ...
- python socket 老生常谈
没啥可说的,直接看代码 //server import socket s = socket.socket() host = socket.gethostname() print 'host: ', h ...
- bat运行时自己隐藏黑框,而不是用vbs来调用自己
//autoStart.bat @echo off if "%1" == "h" goto begin mshta vbscript:createobject( ...