2013-06-28 47 views
2

所以我有一個關於通過引用傳遞的問題。我嘗試通過引用將對象傳遞給成員函數,並讓該成員函數使用作爲參數傳遞的引用調用另一個成員函數。但是,編譯器說沒有找到調用的成員函數。爲什麼?下面的代碼將描述我的方式無奈我無法用言語表達自理C++參考混淆(以及一些複製構造函數)

// CODE 1 
    class someClass { 
     int data; 
     public: 
     someClass(someClass&); 
     someClass someFunction(const someClass&) 
    }; 

    someClass::someClass(someClass &obj) { 
     data = obj.data; 
    } 


    someClass someClass::someFunction(const someClass &obj) { 
     someClass demo(obj); // <- this doesn't work 
     someClass demo(&obj); // <- neither does this 
     someClass demo(*obj); // <- or this 
     someClass demo2(*this); // <- this works though 
    } 

有一個很難理解這一點,似乎微不足道,但我確實感謝所有幫助我可能會。此外,在xcode中發生了一些神祕的事情,當我嘗試以下(指代碼2)時,它就起作用了。任何想法爲什麼?

// CODE 2 
    class someClass { 
     int data; 
     public: 
     someClass(someClass&); 
     void setData(int x) { data = x; } 
    }; 

    int main() { 
     someClass first; 
     setData(10); 
     someClass second; 
     second = first; 
     //Mysteriously, it worked without overloading the '=' operator. Why? 
     //Also, I mentioned XCode just in case someone might say it's compiler specific 

     return 0; 
    } 
+0

我認爲在獲得很多幫助之前,您需要至少展示demo和demo2的原型。 –

回答

2

的困難似乎是如下:

someClass demo(obj); 

您試圖const引用傳遞給需要一個參考,是不是常量的函數。典型的模式是讓複製構造函數採用一個const引用參數,避免了這個問題。

someClass demo(&obj); 

在這種情況下,編譯器正在尋找一個構造函數的指針,SomeClass的,但無法找到它。 &obj返回指向obj的指針,而不是對obj的引用。

someClass demo(*obj); 

在這種情況下,你正試圖取消引用obj,如果它是一個指針,但它是一個參考,而不是一個指針。

someClass demo2(*this); 

這工作,因爲你提領該this指針,它指向在someClass一個實例。

+0

所以你說的是因爲我傳遞了一個const引用到obj中的某個函數,因此一個const引用。 obj被傳遞給構造函數,但構造函數不接受const ref。 OBJ。因此它不起作用? –

+0

這是正確的。您可以將一個非const引用傳遞給一個接受const引用的函數,但是您無法將一個const引用傳遞給一個接受非const引用的函數,因爲該函數可能會嘗試修改其正文中的引用變量,如果實際引用(與虛擬參數相對)爲常量,則不能這樣做。 – Simon