繁体   English   中英

获取器返回空 C++

[英]Getter return null C++

我有class car并且我使用 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]是 reinstance 一样? 谢谢你

setter 运行良好,但是,为什么 getter 像对象 (app[0]) 是 reinstance 一样返回 null?

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

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

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

您想要的是返回对成员变量本身的引用,这将允许您直接编辑其内容。 为此,您需要按以下方式修改您的App类:

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

现在getCar()返回对成员变量car引用,修改此引用将直接修改app[0]car成员变量,从而为您提供预期的行为。

在这种特定情况下,返回引用可以解决您的问题。

但是,一般来说,成员变量的返回引用是一种不好的做法。( 请参阅这篇文章中的详细信息)。

在您的情况下,我认为您在获得汽车时想要共享所有权。 所以可能对汽车使用 shared_ptr 比直接返回引用更好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM