2014-04-17 90 views
-1

我有這個類:C++的參考場擲構造

typedef int ID; 
typedef int Salary; 
class Worker { 
protected: 
ID id; 
Salary& salary; 

public: 
Worker(); 
Worker(ID Id, Salary Salary) { 
     this->id=Id; 
     this->salary=salary; 
    } 

。 。 。 }

這一個:

class WSalary : public Worker { 
public: 
    WSalary(ID Id, Salary& Salary) { 
     this->id=Id; 
     this->salary=Salary; 
    } 
. 
. 
. 
} 

,我必須在構造這個錯誤

uninitialized reference member 'Worker::salary' [-fpermissive]

我想在WSalary類把一個場(稱爲工資)具有相同地址在班級工作人員的「工資」..所以當我改變工人班級的工資時,它會在WSalary班級自動變更。

最新解決方案? 感謝

+0

C++要求'const'和'reference'成員*必須*在*構造函數初始化列表*中被初始化。你沒有。 「薪水工資」作爲一個參數沒有什麼好處,更不用說作爲參考成員的有效初始化工具。 – WhozCraig

回答

0

使用初始化列表:的

WSalary(ID Id, Salary& Salary) : id(Id), salary(Salary) 
{ 
} 

代替

WSalary(ID Id, Salary& Salary) { 
       this->id=Id; 
      this->salary=Salary; 
} 
+1

「工人」示例仍然失效。 – pmr

1

在你的工人例子中,你正在試圖綁定一個值到一個非const引用。這將創建一個懸而未決的參考,並不是一個好主意。只需將一個值存儲在類中而不是引用中,或者將引用作爲構造函數參數傳遞並使用初始化列表。

WSalary你需要使用初始化列表:

WSalary(ID id, Salary& s) : id(id), salaray(s) {} 

或者調用基的構造函數(你應該修復它接受一個參考):

WSalary(ID id, Salary& s) : Worker(id, s) {} 

在C++ 11還可以在派生類中使用以下語法重新使用Worker構造函數:

using Worker::Worker; 
+0

當我使用「WSalary(ID ID,工資&s):id(id),salaray(s){}」 我得到這個錯誤:「 - class'WSalary'沒有任何字段名爲'salary'」 和同樣爲id ...爲什麼?它應該從工作人員接受它.. – user3036061

0

如果間接是有意的,那麼使用一個指針。


一旦它被初始化,就不能引用其他的引用。

這意味着引用成員通常禁止爲該類指派,並且它不能通過賦值來初始化。

相比之下,指針可以通過賦值指向別處。