Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++的OOP,我做了如下代码: main.cpp_C++_Oop - Fatal编程技术网

C++;面向对象问题 我正在学习C++的OOP,我做了如下代码: main.cpp

C++;面向对象问题 我正在学习C++的OOP,我做了如下代码: main.cpp,c++,oop,C++,Oop,现在我的问题是,当我运行这段代码时,我希望monster2对象还有400点生命值,但仍然是450:S 要做到这一点,这里必须做些什么?我注意到,在doDamageToOppoenet中它可以是400,但当它离开该块时,它仍然是450。请帮帮我!谢谢。您正在按值传递对象: void Monster::doDamageToOpponent(Monster opponent) <- This should be by reference int Monster::attack(Monster o

现在我的问题是,当我运行这段代码时,我希望monster2对象还有400点生命值,但仍然是450:S


要做到这一点,这里必须做些什么?我注意到,在doDamageToOppoenet中它可以是400,但当它离开该块时,它仍然是450。请帮帮我!谢谢。

您正在按值传递对象:

void Monster::doDamageToOpponent(Monster opponent) <- This should be by reference
int Monster::attack(Monster opponent) <- idem

如果您想了解更多信息,请阅读以下内容:

您正在通过值传递对象

void Monster::doDamageToOpponent(Monster opponent) <- This should be by reference
int Monster::attack(Monster opponent) <- idem

如果您想了解更多信息,请阅读以下内容:

原因是函数
attack
dodamagetooponent
正在复制参数,因为您通过值传递它们。接下来发生的事情是,你在函数中更改传递的怪物的副本。函数返回后,这些副本将消失(因为它们是函数的本地副本),原始的相关方不会发生任何事情

请尝试通过引用传递参数。引用的工作方式就像它是原始变量一样。考虑:

int a = 0;
int &refa = a; /* refa acts as real "a", it refers to the same object "a" */
int b = a;     /* this is your case */
b = 6;         /* b will be changed, but "a" not */
refa = 6;      /* a is changed, really "a", refa is just different name for "a" */
尝试:


原因是函数
attack
dodamagetooponent
正在复制参数,因为它们是按值传递的。接下来发生的事情是,你在函数中更改传递的怪物的副本。函数返回后,这些副本将消失(因为它们是函数的本地副本),原始的相关方不会发生任何事情

请尝试通过引用传递参数。引用的工作方式就像它是原始变量一样。考虑:

int a = 0;
int &refa = a; /* refa acts as real "a", it refers to the same object "a" */
int b = a;     /* this is your case */
b = 6;         /* b will be changed, but "a" not */
refa = 6;      /* a is changed, really "a", refa is just different name for "a" */
尝试:


您通过值传递对手,即函数:

int Monster::attack(Monster opponent);
将实际收到对手的副本并修改该副本。每次您有一个修改某个对象的函数时,您都需要通过引用传递要修改的对象或传递指向该对象的指针,例如

int Monster::attack(Monster& opponent);

我建议对输入参数使用
const T&
,对输出参数使用
T*
,因此在本例中,使用后一种形式。我推荐后者作为输出参数的原因是,它使调用者更明确:

monster.attack(&monster2); // passing a pointer: monster2 will be modified.

您通过值传递对手,即函数:

int Monster::attack(Monster opponent);
将实际收到对手的副本并修改该副本。每次您有一个修改某个对象的函数时,您都需要通过引用传递要修改的对象或传递指向该对象的指针,例如

int Monster::attack(Monster& opponent);

我建议对输入参数使用
const T&
,对输出参数使用
T*
,因此在本例中,使用后一种形式。我推荐后者作为输出参数的原因是,它使调用者更明确:

monster.attack(&monster2); // passing a pointer: monster2 will be modified.

你知道有关引用的信息吗?你可能应该考虑<代码> ATACKEY。TAUMADAGE(AtCask.GETMaGeAd())< /C>方法,而不是<代码>攻击者。攻击(AtACKEY)< /代码>,这样你就不需要在攻击者的方法中处理ATACKEY的内脏(改进封装和减少耦合)。并且还将稍微减少这些访问器方法的需要。这样,您也不需要引用或指针,因为
getDamage()
返回一个您不需要更改的值。这是您的吗?对我来说似乎不是微不足道的!同时阅读(尤其与标题相关)。此外,头应该只包括干净编译所需的其他头的最小集合,不能多也不能少。此外,oop是关于封装的,这意味着抽象掉公共接口后面的(实现)细节。你不需要(并且提供对所有成员的访问并不是抽象的)。你应该知道:<代码> ATACKEY。AutoDaGeAd(AtCask.GETMaGeAd())< /C>方法,而不是<代码>攻击者。攻击(AtACKEY)< /代码>,这样你就不需要在攻击者的方法中处理ATACKEY的胆量了。(改进封装和减少耦合),还将略微减少对这些访问器方法的需要。这样,您也不需要引用或指针,因为
getDamage()
返回一个您不需要更改的值。这是您的吗?对我来说似乎不是最小的!还可以阅读(特别是与标题相关的)。此外,头应该只包括干净编译所需的其他头的最小集合,不能多也不能少。此外,oop是关于封装的,这意味着抽象掉公共接口后面的(实现)细节。你没有(并且提供对所有成员的访问根本不会抽象它们)@user4080732没问题,如果问题解决了,请记住将其标记为已接受(或任何其他人的)@user4080732没问题,如果问题解决了,请记住将其标记为已接受(或任何其他人的)
monster.attack(&monster2); // passing a pointer: monster2 will be modified.