2013-03-04 95 views
0

我有一個需要改變外部實例化對象的方法。我一直試圖引用參數中的對象,這顯然不起作用。這是我有:將引用傳遞給對象以進行突變C++

#include <iostream> 
#include <cstdlib> 
#include "Character.h" 

using namespace std; 

class TesterClass { 
public: 
    void printStuff(); 
    TesterClass(Character& userChar); 
private: 
    Character& character; 
}; 

TesterClass::TesterClass(Character& userChar) 
{ 
    character = userChar; 
} 
int main() { 
    Character userCharacter; 
    TesterClass tester(userCharacter); 
    return 0; 
} 

我的問題是如何可以使用實例化測試儀類通過參數傳遞編輯字符對象。我在C++方面非常新,我已經閱讀了每個可以感知的參考和點傳遞的定義,而且它似乎不想單擊。

+0

請參閱[初始化列表(http://www.cplusplus.com/forum/articles/17820/) – pauld 2013-03-04 18:16:24

+1

見http://stackoverflow.com/questions/6576109 /初始化參考合構造-C?lq = 1 – pauld 2013-03-04 18:19:30

回答

3

你的構造應該是:

TesterClass::TesterClass(Character& userChar):character(userChar){}

另見this question

爲了解決這個評論,這裏的地方的值被修改的示例代碼:

#include <iostream> 
#include <cstdlib> 

typedef char Character; 

using namespace std; 

class TesterClass { 
public: 
    void printStuff(); 
    TesterClass(Character& userChar); 
private: 
    Character& character; 
}; 

TesterClass::TesterClass(Character& userChar):character(userChar) 
{ 
} 

void TesterClass::printStuff() { 
    cout << character << endl; 
    cout << ++character << endl; 
} 

int main() { 
    Character userCharacter = 'a'; 
    TesterClass tester(userCharacter); 
    tester.printStuff(); 
    cout << userCharacter << endl; 
    ++userCharacter; 
    cout << userCharacter << endl; 
    tester.printStuff(); 
    return 0; 
} 

輸出是

a 
b 
b 
c 
c 
d 
+0

原始對象userCharacter不會根據我的測試通過初始化列表進行修改。任何其他實現? – user2130768 2013-03-04 20:13:04

1

我以前的答案/評論同意 - 你真的應該使用初始化列表中的構造函數。問題是你的數據成員是通過初始化列表初始化的(這發生在調用構造函數的主體之前)。就你而言,你有一個Character&作爲成員。既然這是一個參考,它必須分配一些東西。我不確定你正在使用哪種編譯器,但是AFAIK代碼甚至不應該編譯。

什麼,你可能尋找的是通過參考在主法,如:

int main() 
{ 
    Character userCharacter; 

    // Notice the use of the &-operator 
    TesterClass tester(&userCharacter); 
    return 0; 
} 

在這一點上,你不再談論Character -instance,但內存的實例的地址。所以,由於你傳遞的是mem地址,它實際上是你需要的指針,而不是引用。 (例如,userCharacter.SomeMethod()(&userCharacter)->SomeMethod()同義,其中&參考和->解引用)。

相反,你可以寫你的TesterClass爲:

class TesterClass 
{ 
public: 
    void printStuff(); 
    TesterClass(Character* userChar); 
private: 
    Character* character; 
}; 

TesterClass::TesterClass(Character* userChar) 
    : character(userChar) // <- Notice the init-list 
{} 

這樣一來,在你TesterClass情況下,你必須指向其中userChar -instance所在的同一個內存地址的指針。

作爲一個註釋:雖然userCharacter是一個局部變量,這意味着它在超出範圍時會被銷燬。在這種情況下,它不是一個真正的問題,因爲tester也是本地的。但是如果你不習慣使用指針 - 只是謹慎的話。確保你永遠不會傳遞指針(因爲你將地址存儲在一個類成員中)到一個TesterClass對象,這個對象超出了你傳遞的引用變量的範圍。這會給你一個懸掛的指針。

我希望可以幫助你:)

+0

您的解決方案有效,但您不能使用引用來改變該Character實例的註釋是錯誤的。 – 2013-03-05 14:00:58

+0

啊是的。看到你的解決方案,當然你是對的 - 你可以改變實例。我編輯了我的答案。感謝您指出。 – Lavesson 2013-03-05 14:30:14