0

外部でインスタンス化されたオブジェクトを変更する必要があるメソッドを持つオブジェクトがあります。パラメータでオブジェクトを参照しようとしましたが、明らかに機能していません。これは私が持っているものです:

#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++ の初心者であり、参照とポイントの受け渡しの認識可能なすべての定義を読みましたが、クリックしたくないようです。

4

2 に答える 2

3

コンストラクターは次のようにする必要があります。

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
于 2013-03-04T18:11:29.697 に答える
1

以前の回答/コメントに同意します-コンストラクターで初期化リストを使用する必要があります。問題は、データメンバーが初期化リストを介して初期化されることです (これは、コンストラクターの本体が呼び出される前に発生します)。あなたの場合、あなたはCharacter&メンバーとして持っています。これは参照であるため、何かを割り当てる必要があります。どのコンパイラを使用しているかはわかりませんが、そのコードはコンパイルするべきではありません。

おそらく探しているのは、次のようにメインメソッドで参照を渡すことです。

int main() 
{
    Character userCharacter;

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

この時点で、インスタンスについて話しているのではなくCharacter、インスタンスのメモリ アドレスについて話しているのです。つまり、mem-address を渡しているので、これは実際には参照ではなく、クラスで必要なポインターです。(たとえば、はwhere参照およびdereferencesuserCharacter.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ます。

補足として: これはuserCharacterローカル変数ですが、スコープ外になると破棄されることに注意してください。この場合、testerローカルでもあるため、実際には問題になりません。ただし、ポインターの操作に慣れていない場合は、注意が必要です。TesterClass参照を渡す変数のスコープ外に存在する -object に(アドレスをクラス メンバーに格納しているため) 絶対にポインターを渡さないようにしてください。これにより、ダングリングポインターが残ります。

お役に立てば幸いです:)

于 2013-03-05T00:17:52.733 に答える