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&一个成员。由于这是一个参考,它必须被分配一些东西。我不确定您使用的是哪个编译器,但 AFAIK 代码甚至不应该编译。

您可能正在寻找的是在您的主要方法中传递引用,例如:

int main() 
{
    Character userCharacter;

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

此时,您不再是在谈论Character-instance,而是在谈论实例的内存地址。因此,由于您传递的是内存地址,它实际上是您在类中需要的指针,而不是引用。(例如,userCharacter.SomeMethod()(&userCharacter)->SomeMethod()where&引用和->取消引用的同义词)。

相反,你可以写你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超出您要传递其引用的变量范围的 -object。这会给你留下一个悬空的指针。

我希望对你有帮助:)

于 2013-03-05T00:17:52.733 回答