【问题标题】:Getter return null C++获取器返回 null C++
【发布时间】:2018-02-27 05:20:48
【问题描述】:

我有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] 是重新实例化一样? 谢谢你

【问题讨论】:

  • 你的问题有错字吗?? app[0]/getCar()?

标签: c++ oop mingw


【解决方案1】:

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

您遇到了问题,因为您返回的是Car 成员变量的临时副本,而不是对成员变量本身的引用。更具体地说,您的成员函数 getCar() 返回 Car 而不是 Car&amp;。您当前的版本会将成员变量 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,给你你预期的行为。

【讨论】:

  • omg 非常感谢,我知道该对象没有引用 App 类,但我不知道要在 google 上搜索的关键字,哈哈
【解决方案2】:

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

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

在你的情况下,我认为你在买车时想要共享所有权。所以可能对汽车使用 shared_ptr 比直接返回参考要好。

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

【讨论】:

  • 我同意返回的参考不是最好的设计,但您提出的设计也违反了您链接到的帖子中列出的三个原则中的至少两个。通过返回引用或 shared_ptr,您正在破坏私有数据的封装,因为现在类外的代码可以直接操作私有数据。更好的设计是在 App 中使用成员函数来处理设置汽车颜色。
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 2016-10-30
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多