Getter return 空 C++

Getter return null C++

我有 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 return 为 null,就好像对象 app[0] 是 reinstance 一样? 谢谢

the setter is working well but, why the getter is return null like the object (app[0]) is reinstance?

您遇到问题是因为您return正在临时副本您的Car成员变量而不是对成员变量本身的引用.更具体地说,您的成员函数 getCar() returns Car 而不是 Car&。您当前的版本会将成员变量 car 的值复制到一个临时变量中,并将 return 临时变量复制为它的 return 值,而不是成员变量本身。那么在这段代码中:

app[0].getCar().setColor("red");

您实际上是在修改 getCar() return 编辑的临时副本的内容。由于这是临时副本,临时副本将在语句结束时销毁,您的所有修改都将丢失。此外,app[0]car成员变量将继续保持其默认值。

您想要的是 return 对成员变量本身的引用,这样您就可以直接编辑其内容。为此,您需要按以下方式修改 App class:

class App(){
private:
   Car car;
public:
   App():car(){
   }
   Car& getCar(){
      return car;
   }
}

现在getCar()return是对成员变量car的引用,修改这个引用会直接修改app[0]car成员变量,为您提供预期的行为。

在这种特定情况下,return 参考可以解决您的问题。

但是,一般来说,return引用成员变量是一种不好的做法。(see detail in this post)。

在你的情况下,我认为你希望在购车时共享所有权。所以可能使用 shared_ptr 汽车比直接 returning 参考更好。

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