2011-12-09 4 views
0

私はBulletクラスの代入演算子を定義する必要があると言われましたが、実際に3つのルールを実装する必要があったのは、ポインタクラスメンバー。このコードで代入演算子がどこに呼び出されていますか?

実際に、演算子を呼び出そうとしている行が次のコードのstd::vector<Bullet> bulletsであると言われています。代入演算子がどこで呼び出されているのか、なぜ呼び出されているのか分かりません。どこでも私はBullet bullet1 = bullet2のようなことをしています。

EDIT - また、デフォルトの割り当て演算子が適切でないのはなぜですか? 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 

ゲームオブジェクト:

あなたが持っているソースで0
#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 

答えて

1

bullets = std::vector<Bullet>(); 

デフォルトGameObjectがに割り当てることはできません基準部材meshを持っているので、=演算子は動作しません。

+0

あなたはデフォルトの代入演算子が私のクラスには不十分だと知っていますか? – SirYakalot

+0

@SirYakalot:そうです、私は答えを編集しました...それは参照メンバーのためです。 –

+0

なので、GameObjectにオーバーロードされた演算子を書くのはおそらく大丈夫ですBulletのデフォルト演算子= GameObjectで正しいオーバーロードを呼び出すためですか?それとも間違っているのですか? – SirYakalot

2

GameObject(したがって、そのすべての派生語)には、Meshへの参照が含まれています(実際のクラスまたは構造体のアドレスを保持しています)。参照は構成時に初期化され、再割当てすることはできません。この場合、デフォルトの代入演算子はコンパイラによって生成されません。

1

最初に、デフォルトのoperator=が生成されないのは、 GameObjectに参照(Mesh& mesh)が含まれているためです。コンパイラは、を の1つ以上の参照を含むクラスに対して生成しません。また、基本クラスにoperator=を持たないクラスに対しても、 は生成されません。

投稿したコードに明白な解決策はありません。割り当て可能でないオブジェクトのベクトルを 持つことはできません。

質問は次のとおりです。これらのオブジェクトを実際にコピーしたいのですか? 私はちょうど名前から推測していますが、 のアイデンティティーを持つオブジェクトのようなものです。コードが完成すると、アイデンティティを持つことになります。たとえば、 の位置をBulletに変更した場合は、 にすべてのコピーを追跡したくない場合は、—の BulletのIDを持ちます。

ソリューションは、動的std::vector<Bullet*>を使用すると、(GameObjectから派生し、他のすべて) Bulletのすべてを割り当てること です。あなたが考えるのは普通です:あなたのオブジェクトはゲームの進化によって決定された の寿命を持ち、スコープとは無関係に、あるいは他のオブジェクトの寿命の大部分とは無関係です。 Bulletは、それらを含むGunが破壊された場合、その中のBulletもおそらく破壊されるはずです。しかし、私はまだ Gunというデストラクタを使ってこれをより一般的な方法で処理していましたが、そのBulletの破壊を世話しました。より一般的には、 しかし、オブジェクトが破棄されると、それを参照する他のオブジェクトのすべてを見つけてそのポインタを削除する必要があります。 通常、これにはオブザーバパターンのようなものが必要です— これを正しく処理するスマートポインタはまだありません。

関連する問題