传递对象的引用以进行突变C ++

时间:2013-03-04 18:07:42

标签: c++ pointers object parameters

我有一个对象,其方法需要改变外部实例化对象。我一直在尝试引用参数中的对象,这显然不起作用。这就是我所拥有的:

#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 ++的新手,我已经阅读了每个可感知的参考和点传递的定义,它似乎不想点击。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我同意之前的回答/评论 - 你真的应该在构造函数中使用初始化列表。问题是你的数据成员是通过初始化列表初始化的(这是在调用构造函数体之前发生的)。在您的情况下,您有Character&成员。由于这是一个参考,它必须分配一些东西。我不确定您使用的是哪种编译器,但AFAIK代码甚至无法编译。

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

int main() 
{
    Character userCharacter;

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

此时,您不再讨论Character - 实例,而是讨论实例的内存地址。所以,既然你传递了mem-address,它实际上是你班上需要的指针,而不是引用。 (例如,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 - 实例所在的同一内存地址。

作为旁注:尽管userCharacter是一个局部变量,但这意味着它在超出范围时会被销毁,这是值得注意的。在这种情况下,它不是真正的问题,因为tester也是本地的。但如果你不习惯使用指针 - 只需谨慎一点。确保你永远不会将指针(因为你将地址存储在类成员中)传递给TesterClass - 超出了你所引用的引用变量范围的对象。那会给你一个悬垂的指针。

我希望能帮到你:)。