簡體   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