【问题标题】: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 实例的副本。您能否详细说明我如何实现这一目标?谢谢!

标签: c++ function class object


【解决方案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; } 作为第二种选择来改进答案。
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2020-05-10
相关资源
最近更新 更多