2011-01-23 13 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,說'operator ='在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;不會更改該成員引用的對象,它試圖修改該對象始終提及並始終會引用的對象。

如果您需要您的類來改變其他對象(S)是指,使用指針成員,而不是引用成員。您可以保留相同的公共接口,只需使用&*運算符即可「轉換」。

+0

傻我。謝謝! – 2011-01-23 15:26:24

1

問題很簡單。你有參考作爲你的班級成員:

Layer & current_layer;

細胞& current_cell;

編譯器無法生成構造函數,因爲它不知道如何初始化這些引用,因此您需要定義自己的構造函數。

0

玩家不能讓編譯器生成默認ctor,因爲它有引用成員。編譯器應該將這些引用綁定到什麼地方?