Getter返回空C ++

By simon at 2018-02-28 • 0人收藏 • 61人看过

我有class car,我在class App中使用汽车作为属性。

class Car{
private:
  string color;
public:
  //setter getter
  void setColor(string c){
     color = c;
  }
  string getColor(){
     return color;
  }
}
class App(){
private:
   Car car;
public:
   App():car(){
   }
   Car getCar(){
      return car;
   }
}
这是我的主要应用程序
int main(){
  App app[2];

  app[0].getCar().setColor("red")
  //WHY RETURN NULL?
  cout << app[0]/getCar().getColor();
  return 0;
}
setter运行良好,但为什么getter返回null,就好像是 对象app[0]是否恢复?谢谢

3 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

setter运行良好,但为什么getter返回null类似于 对象(app [0])是否恢复? 你有问题因为你正在返回你的一个临时副本 Car成员变量而不是对成员变量的引用Ë 本身。更具体地说,你的成员函数getCar()返回 Car而不是Car&.你现在的version会复制 成员变量car的值变为临时值并返回 暂时作为其回报价值,没有t成员变量本身。那么在这呢 码:

app[0].getCar().setColor("red");
您实际上正在修改临时副本的内容在 getCar()返回。由于这是临时副本,所以临时会是 在声明结束时被销毁,等等你的修改将是 丢失。此外,app[0]的car成员变量将会 继续保持默认状态值。 你想要的是返回一个对成员变量本身的引用 允许您直接编辑其内容。 Ťo做到这一点,你需要修改你的 App类按以下方式:
class App(){
private:
   Car car;
public:
   App():car(){
   }
   Car& getCar(){
      return car;
   }
}
现在getCar()返回一个参考到成员变量car, 修改此引用将直接修改car成员 变量app[0],给你你的预期行为。

2018-02-28   #2

setter运行良好,但为什么getter返回null类似于 对象(app [0])是否恢复? 你有问题因为你正在返回你的一个临时副本 Car成员变量而不是对成员变量的引用Ë 本身。更具体地说,你的成员函数getCar()返回 Car而不是Car&.你现在的version会复制 成员变量car的值变为临时值并返回 暂时作为其回报价值,没有t成员变量本身。那么在这呢 码:

app[0].getCar().setColor("red");
您实际上正在修改临时副本的内容在 getCar()返回。由于这是临时副本,所以临时会是 在声明结束时被销毁,等等你的修改将是 丢失。此外,app[0]的car成员变量将会 继续保持默认状态值。 你想要的是返回一个对成员变量本身的引用 允许您直接编辑其内容。 Ťo做到这一点,你需要修改你的 App类按以下方式:
class App(){
private:
   Car car;
public:
   App():car(){
   }
   Car& getCar(){
      return car;
   }
}
现在getCar()返回一个参考到成员变量car, 修改此引用将直接修改car成员 变量app[0],给你你的预期行为。

2018-02-28   #3

在这种特定情况下,返回引用可以解决您的问题。 但是,通常,成员变量的返回引用是坏的 练习。([详见本文 帖](https://stackoverflow.com/questions/8005514/is-returning-references-of- 成员variablES-坏的做法))。 就你的情况而言,我认为你需要拥有共享所有权。所以可能是 为汽车使用shared_ptr更好比直接返回参考。

class App
{
public:
    App() : car(std::make_shared<Car>()){};
    std::shared_ptr<Car> getCar() {return car;}
private:
    std::shared_ptr<Car> car;
};

登录后方可回帖

Loading...