我被告知我必须为我的Bullet类定义一个赋值运算符,但是我的印象是你真正需要实现三个规则的唯一一次是当你自己显式处理内存时,比如指针类构件。
我实际上告诉我,在以下代码中,试图调用operator =的行是std::vector<Bullet> bullets
。我只是不明白调用赋值运算符的位置,以及调用它的原因。我无处可能做Bullet bullet1 = bullet2
;
编辑 - 还有,为什么默认的赋值运算符不合适?我在Bullet的层次结构中没有任何指针成员。
感谢您的帮助。
#ifndef GUN_H
#define GUN_H
#include "gameObject.h"
#include "Bullet.h"
#include <vector>
class Mesh;
class Gun : public GameObject
{
private:
std::vector<Bullet> bullets; // this line right here
protected:
virtual void TriggerPulled() = 0;
public:
Gun(Mesh& mesh);
virtual ~Gun();
std::vector<Bullet>& Bullets();
};
#endif
这是同一档案的来源:
#include "Gun.h"
#include "Mesh.h"
Gun::Gun(Mesh& mesh) : GameObject(mesh)
{
bullets = std::vector<Bullet>();
}
Gun::~Gun() {}
std::vector<Bullet>& Gun::Bullets()
{
return bullets;
}
这是子弹:
#ifndef BULLET_H
#define BULLET_H
#include "BoundingSphere.h"
#include "helperMethods.h"
#include "GameObject.h"
class Bullet : public GameObject
{
private:
float velocity;
float distance;
D3DXVECTOR3 firedFrom;
BoundingSphere bSphere;
public:
Bullet(D3DXVECTOR3 position, D3DXVECTOR3 rotation, float velocity, D3DXCOLOR colour, Mesh& mesh);
~Bullet();
BoundingSphere& BulletSphere();
};
#endif
BoundingSphere所:
#ifndef BOUNDING_SPHERE_H
#define BOUNDING_SPHERE_H
#include <d3d10.h>
#include <d3dx10.h>
class Ray;
class BoundingBox;
class BoundingSphere
{
private:
D3DXVECTOR3 centre;
float radius;
public:
BoundingSphere(D3DXVECTOR3 position, float radius);
BoundingSphere();
bool Intersects(BoundingSphere boundingSphere);
bool Intersects(BoundingBox boundingBox);
bool Intersects(Ray ray, D3DXVECTOR3& result);
// getters
const D3DXVECTOR3 Centre();
const float Radius();
// setters
void BoundingSphere::Centre(D3DXVECTOR3 centre);
};
#endif
游戏物体:
#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H
#include <d3d10.h>
#include <d3dx10.h>
class Mesh;
class GameObject
{
private:
D3DXVECTOR3 scale;
D3DXVECTOR3 rotation;
D3DXVECTOR3 position;
D3DXCOLOR colour;
D3DXMATRIX matFinal;
Mesh& mesh;
protected:
void Draw(D3DMATRIX matView, D3DMATRIX matProjection);
public:
GameObject(Mesh& mesh);
virtual ~GameObject();
//getters
const D3DXVECTOR3 Scale();
const D3DXVECTOR3 Rotation();
const D3DXVECTOR3 Position();
const D3DXCOLOR Colour();
//setters
void Scale(D3DXVECTOR3 scale);
void Rotation(D3DXVECTOR3 rotation);
void Position(D3DXVECTOR3 position);
void Colour(D3DXCOLOR colour);
};
#endif
答案 0 :(得分:2)
GameObject
(因此它的所有衍生物)包含对Mesh
的引用。引用在构造时初始化,不能重新分配,因此在这种情况下编译器不会生成默认赋值运算符。
答案 1 :(得分:1)
在源代码中:
bullets = std::vector<Bullet>();
默认=运算符不起作用,因为GameObject
具有无法分配的引用成员mesh
。 (它几乎就像一个指针。它包含一个实际类或结构的地址)
答案 2 :(得分:1)
首先,未生成默认operator=
的原因是因为
GameObject
包含引用(Mesh& mesh
)。编译器没有
为包含一个或多个引用的类生成operator=
,
也不适用于基类没有operator=
。
您发布的代码中没有明显的解决方案;你不能拥有 对象的矢量不可分配。
问题是:你真的希望能够复制这些对象吗?
我只是从名字中猜测,但这听起来像是对象
拥有身份,或者在代码完成后具有身份。如果你
改变Bullet
的位置,例如,你不想拥有
追踪所有副本,并在其中更改它们
Bullet
有身份。
解决方案是使用std::vector<Bullet*>
,并分配全部
Bullet
(以及从GameObject
派生的所有其他内容)
动态。如果你考虑一下,这是正常的:你的对象有
由游戏的演变决定的生命周期,并且是
独立于范围,或在很大程度上与任何其他对象的生命周期无关。
Bullet
可能是一个例外,因为如果Gun
包含它们
被毁坏后,其中的Bullet
也可能被销毁。但
我仍然以更通用的方式处理它,使用析构函数
Gun
照顾其Bullet
的毁灭。更普遍,
然而,当一个物体被摧毁时,你将不得不找到所有物体
引用它的其他对象,并删除它们的指针。
通常,这需要像观察者模式这样的东西 - 我
还没有看到任何正确处理这个的智能指针。