Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将对对象的引用传递给突变C++;_C++_Pointers_Object_Parameters - Fatal编程技术网

C++ 将对对象的引用传递给突变C++;

C++ 将对对象的引用传递给突变C++;,c++,pointers,object,parameters,C++,Pointers,Object,Parameters,我有一个对象,其方法需要改变外部实例化对象。我一直在尝试引用参数中的对象,这显然不起作用。这就是我所拥有的: #include <iostream> #include <cstdlib> #include "Character.h" using namespace std; class TesterClass { public: void printStuff(); TesterClass(Character& userChar); priva

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

#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.h”
使用名称空间std;
类测试员类{
公众:
作废印刷品();
TesterClass(字符和用户字符);
私人:
性格&性格;
};
TesterClass::TesterClass(字符和用户字符)
{
character=userChar;
}
int main(){
字符用户字符;
测试器类测试器(userCharacter);
返回0;
}

我的问题是如何使用实例化的tester类通过参数传递来编辑Character对象。我在C++中是非常新的,我已经阅读了每个可感知的引用和点传递的定义,它似乎并不想点击。< /p> < p>你的构造函数应该是:

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;
}

您的构造函数应该是:

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;
}

我同意前面的回答/评论-您真的应该在构造函数中使用初始化列表。问题是您的数据成员是通过初始化列表初始化的(这发生在调用构造函数主体之前)。在您的情况下,您有一个
字符&
作为成员。因为这是一个引用,所以必须给它赋值。我不确定您使用的是哪种编译器,但我知道这些代码甚至不应该编译

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

int main() 
{
    Character userCharacter;

    // Notice the use of the &-operator
    TesterClass tester(&userCharacter);
    return 0;
}
此时,您不再讨论
字符
-实例,而是讨论实例的内存地址。因此,由于您要传递mem地址,它实际上是类中需要的指针,而不是引用。(例如,
userCharacter.SomeMethod()
(&userCharacter)->SomeMethod()
的同义词,其中
&
引用和
->
取消引用)

相反,您可以将
测试程序类编写为:

class TesterClass 
{
public:
    void printStuff();
    TesterClass(Character* userChar);
private:
    Character* character;
};

TesterClass::TesterClass(Character* userChar)
    : character(userChar) // <- Notice the init-list
{}
类测试器类
{
公众:
作废印刷品();
TesterClass(字符*用户字符);
私人:
字符*字符;
};
TesterClass::TesterClass(字符*userChar)

:character(userChar)//我同意前面的答案/注释-您确实应该在构造函数中使用初始化列表。问题是您的数据成员是通过初始化列表初始化的(这发生在调用构造函数主体之前)。在您的情况下,您有一个
字符&
作为成员。因为这是一个引用,所以必须给它赋值。我不确定您使用的是哪种编译器,但我知道这些代码甚至不应该编译

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

int main() 
{
    Character userCharacter;

    // Notice the use of the &-operator
    TesterClass tester(&userCharacter);
    return 0;
}
此时,您不再讨论
字符
-实例,而是讨论实例的内存地址。因此,由于您要传递mem地址,它实际上是类中需要的指针,而不是引用。(例如,
userCharacter.SomeMethod()
(&userCharacter)->SomeMethod()
的同义词,其中
&
引用和
->
取消引用)

相反,您可以将
测试程序类编写为:

class TesterClass 
{
public:
    void printStuff();
    TesterClass(Character* userChar);
private:
    Character* character;
};

TesterClass::TesterClass(Character* userChar)
    : character(userChar) // <- Notice the init-list
{}
类测试器类
{
公众:
作废印刷品();
TesterClass(字符*用户字符);
私人:
字符*字符;
};
TesterClass::TesterClass(字符*userChar)

:character(userChar)//根据我的测试,原始对象userCharacter不会通过初始化列表进行修改。任何其他实现?原始对象userCharacter不会根据我的测试通过初始化列表进行修改。还有其他的实现吗?你的解决方案是可行的,但是你不能使用引用来改变角色实例的评论是错误的。啊,是的。看到了你的解决方案,当然你是对的-你可以改变实例。我编辑了我的答案。谢谢你指出。你的解决方案是有效的,但是你不能使用引用来改变角色实例的评论是错误的。啊,是的。看到了你的解决方案,当然你是对的-你可以改变实例。我编辑了我的答案。谢谢你指出这一点。