Getter return null 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;
}
二传手运行良好,但为什么 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;
};
相关文章:
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 为什么要从main()返回NULL?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 使用 curl_easy_cleanup(curl) 时收到未经处理的 NULL 异常
- ClassTemplateSpecializationDecl 的定义数据为 null