2011-07-04 65 views
22

我不認爲是重複的問題。有類似的,但他們並沒有幫助我解決我的問題。初始化構造函數C++中的引用

this,下面是用C有效++:

class c { 
public: 
    int& i; 
}; 

然而,當我這樣做,我得到以下錯誤:

error: uninitialized reference member 'c::i' 

我怎麼能初始化成功地做到i=0上施工?

非常感謝。

+0

你能告訴我們更多關於你是真正的問題嗎? – fulmicoton

+0

聽起來像你想要一個指針。 – Mikhail

+0

@Mikhail,[Bjarne Stroustrup](http://www.stroustrup.com)不喜歡指針。我不知道他會做什麼,我假設不使用指針。 – user34660

回答

28

沒有這樣的事情作爲「空參考」。您在提供對象初始化的參考。把它放在構造函數的基礎初始化列表:

class c 
{ 
public: 
    c(int & a) : i(a) { } 
    int & i; 
}; 

另一種方法是i(*new int),但會很可怕。

編輯:也許要回答你的問題,你可能只是想i成爲會員的對象,而不是一個參考,所以只說int i;,並編寫構造無論是作爲c() : i(0) {}c(int a = 0) : i(a) { }

+0

「另一種方法是我(* new int),但那太糟糕了。」如果DTOR在該指針上調用「delete」,則不會。 – Constantinius

+1

@Constantinius:即使你記得清理過程,它仍然是相當可怕的......只是考慮作業,副本,異常安全等...... –

+0

例如:如果你的類有另一個數據成員,我',或者如果它在構造函數的主體中有代碼,並且該代碼會引發異常,那麼不會調用析構函數並且資源被泄漏。如果一個類擁有一個資源,那真的應該是它所做的唯一的事情。但是,當然,如果你設計一個類來保存一個完全由該對象所擁有的「int」,那麼你不會使用引用成員,而是使用「int」成員,所以這個「問題」不會在實踐中出現。 –

0

引用必須在創建時進行初始化。因此,在創建類時必須對其進行初始化。你也必須提供一些法律對象來引用。

你必須使用初始化在構造函數:

class c { 
public: 
    c(const int& other) : i(other) {} 
    int& i; 
}; 
+1

這是一件可怕的事情。 – fulmicoton

+0

懸掛引用臨時? –

+0

我剛剛編輯,我知道:) – Constantinius

4

除了甜美的語法,引用的一個主要特點是,你非常肯定它總是指向一個值(否NULL值) 。

設計API時,它強制用戶不發送NULL。 使用API​​時,您知道沒有閱讀文檔,NULL在這裏不是一個選項。

-3
template<class T> 
class AVLNode { 

private: 
     T & data; 
public: 
     AVLNode(T & newData) { 
      data = newData; 
     } 
}; 
+1

'AVLNode'或你的代碼與所問的問題有什麼關係? – Pang

+4

請解釋您的答案如何解決問題,這將有助於大家更清楚地瞭解您的解決方案併爲將來的參考。 – Aziz

+1

雖然這段代碼可能有助於解決問題,但它並沒有解釋_why_和/或_how_它是如何回答問題的。提供這種附加背景將顯着提高其長期價值。請[編輯]您的答案以添加解釋,包括適用的限制和假設。 –

-1

參考應當通過將數據傳遞到構造函數或如果你想在默認的構造函數初始化從堆中分配內存初始化。

class Test 
{ 
    private: 
     int& val; 
     std::set<int>& _set; 
    public: 
     Test() : val (*(new int())), 
       _set(*(new std::set<int>())) { } 

     Test(int &a, std::set<int>& sett) : val(a), _set(sett) { } 
}; 

int main() 
{ 
    cout << "Hello World!" << endl; 
    Test obj; 
    int a; std::set<int> sett; 
    Test obj1(a, sett); 
    return 0; 
} 

感謝