[英]Passing a reference to an object for mutation 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;
}
我的問題是如何使用實例化的測試器類通過參數傳遞來編輯Character對象。 我是C ++的新手,我已經閱讀了引用和點傳遞的所有可理解的定義,但似乎不想單擊它。
您的構造函數應為:
TesterClass::TesterClass(Character& userChar):character(userChar){}
也看到這個問題 。
為了解決這個問題,下面是修改值的示例代碼:
#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
我同意前面的答案/評論-您確實應該在構造函數中使用初始化列表。 事實是,您的數據成員是通過初始化列表進行初始化的(這在調用構造函數的主體之前發生)。 在您的情況下,您有一個Character&
作為成員。 由於這是參考,因此必須為其分配一些東西。 我不確定您使用的是哪個編譯器,但是即使該代碼也不應該編譯。
您可能正在尋找的是在主方法中傳遞引用,例如:
int main()
{
Character userCharacter;
// Notice the use of the &-operator
TesterClass tester(&userCharacter);
return 0;
}
在這一點上,您不再在談論Character
實例,而是在談論實例的內存地址。 因此,由於要傳遞內存地址,因此它實際上是類中需要的指針,而不是引用。 (例如, 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
是一個局部變量,但最好注意userCharacter
,這意味着它在超出范圍時將被銷毀。 在這種情況下,這並不是真正的問題,因為tester
也是本地的。 但是,如果您不習慣使用指針,請注意。 確保永遠不要將指針傳遞給TesterClass
(因為您將地址存儲在類成員中),該TesterClass
壽命超出了要傳遞其引用的變量的范圍。 那會讓您留下一個懸空的指針。
希望對您有所幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.