簡體   English   中英

傳遞對對象的引用以進行突變C ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM