2011-01-23 3 views
1

私はgetter/setterを使用している経験を積んだC++プログラマでは使用しません。コード:C++ C2582コンパイラは、デフォルトのc'torまたは=演算子を自動生成しません

#include "Player.h" 

class Entity 
{ 
public: 
    Entity::Entity(Player& _owner) 
     : owner(_owner) { } 
    Player &get_owner() { return this->owner; } 
    void set_owner(Player &_owner) { this->owner = _owner; } 

private: 
    Player &owner; 
}; 

これは私に言っC2582与え「演算子を=」set_owner機能でプレーヤーのため使用できません。 !私はいつも私のデフォルトコンストラクタ/デストラクタと=演算子をするだろうと思った今まで

class Layer; 
class Cell; 

class Player 
{ 
public: 
    Player(); 
    void credit_to_balance(const long &_amount); 
    ..more getter/setter.. 
private: 
    long balance; 
    Layer &current_layer; 
    Cell &current_cell; 
}; 

:マイプレイヤークラスは、次のようになります!私がそれを自分でやっていないならば、コンパイラによって構築されます(そしてそれらはプログラムを通して使われます)。今度は他のクラスもPlayerから手作業で挿入されたデフォルトのc'torを削除すると不平を言うので、今回はそうではありません。私はまったく同じ(たとえフォワード宣言とメンバーが参照であっても)小さなサンプルプログラムを書こうとしましたが、それはうまくいったのです。

私の意見では、それはいくつかの参照と組み込み型をコピーするだけなので、間違いなくすべきです。コンパイラが私のためにそれをするのが難しいとは思わないので、私はまだ自分の=演算子を書くことを試みなかったのです。私にとっては、クラスに新しいメンバーを導入するたびに、それを更新することを念頭に置くことの問題につながります。

この問題に関する私の考えはそれほどです。私はあなたが私が逃しているものを私に見せてくれることを願っています:) 事前に感謝!

答えて

8

リファレンスを「再装着」することはできません。参照であるクラスメンバーでさえも、参照することはできません。 this->owner = _owner;は、メンバーが参照するオブジェクトを変更するつもりはなく、常にオブジェクトを変更しようとしています。this->ownerは常に参照されています。

クラスが参照する他のオブジェクトを変更する必要がある場合は、参照メンバの代わりにポインタメンバを使用します。同じパブリックインターフェイスを維持して、&*演算子を使用して「変換する」ことができます。

+0

愚かな私。ありがとう! –

1

問題は簡単です。あなたのクラスのメンバーとして参照を持っています:

レイヤ& current_layer;

細胞& current_cell。

これらの参照を初期化する方法がわからないので、コンパイラはコンストラクタを生成できないため、独自のコンストラクタを定義する必要があります。

0

参照メンバーがあるため、コンパイラはデフォルトのctorを生成できません。これらの参照をバインドするはずのコンパイラは何ですか?

関連する問題