[英]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.