C+写个游戏引擎—9

面向对象编程,这里面向本意是基于对象进行编程,以对象为基础来组织代码来进行编程。是一种流行的编程风格,曾经风靡一时。典型的代表就是大名鼎鼎的 java 和 c#。c 并不是面向对象编程的语言,其中也没有类和对象的概念。而在 c++ 中支持面向对象编程,c++ 中的类是用于组织数据和方法。

1. class 和 struct

例如在游戏中的人物,怎么表示人物,我们可通过位置和速度来表示人物的移动。3d表示人物的外表。

看起来,这样变量定义不是很清晰,调整一下,我们用 PlayerX PlayerY PlayerSpeed 代替 x y speed 来定义player 想象一下,一般在游戏中会有多个玩家,我们就需要定义一些列 PlayerNX 来表示不同玩家,这样代码看上去有些问题。这样下去,随着开发 player 变得越来越复杂。这种形式就难以应付复杂情况了。

我们可以用 class 来简化上面的代码,以 class 形式定义 player。我们定义一个 Player 类,如下图。然后实例化一个 Player 的实例 player。类(class)定义中默认情况下的成员是 private 的,所以当我们 palyer.x = 10 时,编译时会报错,提示 x 是 player 的私有属性。私有表示只有 class 内部的方法可以使用该属性,外部是无法使用私有属性的。我们将 x, y 定义为公有属性。

定义一个函数 Move 接受 Player 引用和两个 int 类型的数据作为参数,来更新 Player 对象的 x y 位置.

我们可以将这个与 Player 类关系密切的函数移入 Player 类,这样就简化了代码,看起来也更人性化。大家注意我们用 struct 代替 class 来定义 Player,在这里顺便介绍一下 struct。

在c++中类与结构体的唯一区别是:类(class)定义中默认情况下的成员是private的,而结构体(struct)定义中默认情况下的成员是 public 的。

在 c 中不支持 class 这个关键字,我们于可以将 class 定义为 struct 来解决这个问题。

2.静态数据成员

静态属性,类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。静态数据成员实际上是类域中的全局变量。

通过一个实例来更深入地了解 class 和 struct 静态属性。我们定义 Entity struct,两个x, y 属性一个 Print 打印方法。

然后实例化两个 Entity 的实例,并使用 Print 输出值。

将 Entity struct 的 x, y 修改为静态成员属性。

我们调整代码后再次输出,发现链接时报错了,无法解析的外部符号...,

我们需要初始化一下静态成员属性,无需赋值。

我们再次运行代码,发现这次虽然没报错,但是两次的打印结果相同,这是因为静态数据成员被类的所有对象所共享。所以静态数据成员作用域为类级别而非对象级别

如果我们这样写来为 x, y 赋值就更加清晰了。

3继承

定义了两个 class 第一个 class Entity 我们定义 x 和 y 坐标和一个更新坐标的 Move 方法,第二类 class Player 在 Entity 基础上多了一个 name 成员属性。

我们可以让 Player 继承 Entity类,便可以获得 Entity 所有属性和方法,这样就达到去掉相同代码效果,避免代码重复。

输出 Entity 所在内存字节数为 8 = float(4) + float(4)

输出 Player 所在内存数为 12(32位 char 为 4,而 64 位 char 为 8)=float + float + char

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180311G0HLAB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券