IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> c++ 前置声明 -> 正文阅读

[游戏开发]c++ 前置声明

#pragma once
class bar;
class foo
{
public:
?? ?Bar getBar();
private
?? ?Bar* _bar;
};

即:在.h文件中用class 声明代替include头文件

前置声明只能作为指针引用,不能定义类的对象,自然也就不能调用对象中的方法了。

前置声明要求:

1.其声明的类是文件所声明的类的数据成员时,是指针成员或引用成员(而不是对象成员);

2.其声明的类是文件所声明的类的成员函数的参数返回值时,该函数在文件中不存在定义。 ??

?原因:其声明的类是文件所声明的类的数据成员时,因为编译器申请空间时需要其定义,而指针需要的空间固定(引用的实现也基于指针)。 ??其声明的类是文件所声明的类的成员函数的参数或返回值时,因为函数的声明并没有使用到该类的定义,而函数的定义则很大可能使用到该类的定义。但是一般情况下,除非函数定义极短,否则成员函数的声明和定义一般是分离在.h文件和.cpp文件中的,所以可以说其声明的类是文件所声明的类的成员函数的参数或返回值时可以使用前置声明。

为什么使用前置声明

  • 当两个类相互包含头文件时无法通过编译。(必须使用)
  • 有助于分离类的声明和定义文件。(只在.cpp文件中include .h文件)(按照个人风格)
  • 节省编译时间。(修改某个头文件后需要编译多个无关的依赖文件)(按照需求)前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过 必要的重新编译过程。关于类与类的关系,总共有6种,具体见c++类之间的基本关系_baidu_16370559的博客-CSDN博客

延伸:

1.定义式:就是.h文件中用include其他头文件

2.使用前置声明,在.h文件中用class,在.cpp还是要include其他使用到的头文件,虽然这样,还是可以减少部分文件的编译。表现在:

总之,此时任何接口类头文件产生的变化只会导致接口类头文件的变化而重新编译,以及Person实现文件由于include了接口类的头文件也要重新编译;而Person类头文件由于只使用了类的声明式,所以并不会重新编译,因此所有使用Person类的对象的文件也都不需要重新编译了,这样就大大降低了文件之间的编译依存关系。

// Person.h
#include <string>
using namespace std;

class PersonImp;
class Date;
class Address;

class Person
{ ??
public:
? ? Person(const std::string& name,const Date& birthday,const Address& addr);
? ? string Name() const;
? ? string Birthday() const;
? ? string Address() const;

private:
? ? //string Name; ? ? ? ? ? ?之前的定义方式,并且以include头文件实现
? ? //Date Birthday;
? ? //Address Address;
? ? std::tr1::shared_ptr<PersonImp> pImpl; ? ??
? ? //通过提供的PersonImp接口类指针替换实现Person,起到了隔离的作用

// Person.cpp
#include "Person.h" ? ? ? ? ? ? ? ? ? ? //正在实现Person类
#include "PersonImpl.h" ? ? ? ? ? ? ? ? //使用PersonImp接口类实现Person
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //类,必须使用其成员函数,所以要
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //include接口类头文件
Person::Person(const std::string& name,const Date& birthday,const Address& addr)
:pImpl(new PersonImpl(name,birthday,addr))
{ }
string Person::Name() const
{
? ? return pImpl->Name();
}
... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//其余函数实现

// PersonImp.h
#include <string>
#include "MyAddress.h"
#include "MyDate.h"
using namespace std;

class PersonImp ? ? ? ? ? ? ? ? //充当一个接口类,成员函数和Person相同,供
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //Person类通过指针调用
{
public:
? ? string Name() const
? ? {
? ? ? ? return Name;
? ?}
? ?... ? ? ? ? ? ? ? ? ? ? ? ? ?//其余成员函数定义

private:
? ? string Name; ? ? ? ? ? ? ? ?//放置了所需的外来类对象
? ? MyAddress Address;
? ? MyDate Birthday;
};


?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:15:25  更:2021-09-30 12:15:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 3:33:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码