我有一个对象,其方法需要改变外部实例化对象。我一直在尝试引用参数中的对象,这显然不起作用。这就是我所拥有的:
#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 ++的新手,我已经阅读了每个可感知的参考和点传递的定义,它似乎不想点击。
答案 0 :(得分: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
答案 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
- 超出了你所引用的引用变量范围的对象。那会给你一个悬垂的指针。
我希望能帮到你:)。