为啥我的函数每次调用时都会创建一个新对象?
Posted
技术标签:
【中文标题】为啥我的函数每次调用时都会创建一个新对象?【英文标题】:Why my function creates a new object every time it is called?为什么我的函数每次调用时都会创建一个新对象? 【发布时间】:2021-01-19 18:24:39 【问题描述】:我有一个类“房间”,它有一个类型为“英雄”的变量。我面临的问题是,每当我调用类型为 RoomObject.GetHeroObject().MethodOfHero() 的方法时,都会创建一个新的 Hero 对象。更奇怪的是 RoomObject.GetHeroObject() 总是返回同一个类型为“Hero”的对象,然而 MethodOfHero() 每次都以某种方式引用不同的对象。
class Hero; //Forward declaration
class Room
protected:
Hero *hero;
...
Hero Room::getHero()return *hero;;
void Hero::move(char c)
if(c==KEY_UP)
cout<<"up";
moveUp();
else if(c==KEY_DOWN)
moveDown();
cout<<"down";
else if(c==KEY_LEFT)
moveLeft();
cout<<"left";
else if(c==KEY_RIGHT)
moveRight();
cout<<"right";
else
cout<<"Incorrect input";
return;
int main()
Room unfurnished1= Room(5, 15);
unfurnished1.getHero().move('w');
【问题讨论】:
Hero Room::getHero()return *hero;;
创建Hero
实例的副本。您的意思是返回参考吗?如果是这样,返回类型应该是Hero&
。
如果您执行int Room::getHero() return 3;
,您会期望a.getHero()++;
以某种方式导致对getHero()
的下一次调用返回4?
我确实想返回一个引用而不是创建一个 Hero 实例的副本。您能否详细说明我如何实现这一目标?谢谢!
【参考方案1】:
问题在于Room::getHero()
返回Hero
,而不是引用或指向现有Hero
的指针。这使得每次调用该函数时都会生成一个由Room::hero
指向的Hero
的新副本。
对此的解决方案是让getHero
返回一个指针或对Room::hero
的引用。下面是一个使用指针的例子:
Hero* Room::getHero() return hero;
【讨论】:
非常感谢,这确实解决了我的问题!我对 C++ 比较陌生 可以通过添加Hero& Room::getHero() const noexcept return *hero;
作为第二种选择来改进答案。以上是关于为啥我的函数每次调用时都会创建一个新对象?的主要内容,如果未能解决你的问题,请参考以下文章