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