为啥我的函数每次调用时都会创建一个新对象?

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&amp; 如果您执行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&amp; Room::getHero() const noexcept return *hero; 作为第二种选择来改进答案。

以上是关于为啥我的函数每次调用时都会创建一个新对象?的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程———内联函数

Mongoose lambda 示例每次被触发时都会创建一个新连接

JS创建对象的几种方式

Effictive Java学习笔记1:创建和销毁对象

javascript原型和内存[重复]

Angular2,为啥每次移动鼠标时都会调用函数