Getter return null C++

Getter return null C++

本文关键字:C++ null return Getter      更新时间:2023-10-16

我有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;
}

二传手运行良好,但为什么 getter 返回 null,就好像对象app[0]是实例一样? 谢谢

setter 运行良好,但是,为什么 getter 像对象 (app[0]) 是实例一样返回 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;
};