Class 对象在 post 增量后删除
Class object deleting after post increment
我有天气 class。因此,假设我创建了一个 class 的对象,假设 Weather object;
之后我创建了 pre 和 post 增量来操纵该天气的温度。因此,当我执行 ++object;
时,温度完美地增加了一个,但是当我执行 object++;
时,析构函数被调用,我的指针被删除,然后我的温度变成随机数。我的问题是,为什么在世界上预增量工作,但在 post 增量之后在该对象上调用析构函数?这是我的工作前增量:
Weather &Weather::operator++() {
++ptr->airTemperature;
return *this;
}
这是无效的 post 增量:
Weather Weather::operator++(int) {
Weather temp = *this;
++ptr->airTemperature;
return temp;
}
据我了解,预增量 returns 本身和 post 增量 returns 一个副本,所以我这样做了,但可能导致问题的原因是什么?
尝试这样的事情,你可以避免所有的复制构造函数和析构函数。
class Temp {
double airTemperature;
};
class Weather {
public:
Weather(std::shared_ptr<Temp> tempPtr)
: ptr(tempPtr){}
std::shared_ptr<Temp> ptr;
Weather Weather::operator++(int) {
Weather temp = *this;
++ptr->airTemperature;
return temp;
}
Weather &Weather::operator++() {
++ptr->airTemperature;
return *this;
}
};
当然要考虑你是否真的需要一个指向Temp的指针。也许你应该这样做。
class Weather {
public:
Weather(Temp temp)
: temp(temp){}
Temp ptr;
Weather Weather::operator++(int) {
Weather temp = *this;
++temp.airTemperature;
return temp;
}
Weather &Weather::operator++() {
++temp.airTemperature;
return *this;
}
};
我有天气 class。因此,假设我创建了一个 class 的对象,假设 Weather object;
之后我创建了 pre 和 post 增量来操纵该天气的温度。因此,当我执行 ++object;
时,温度完美地增加了一个,但是当我执行 object++;
时,析构函数被调用,我的指针被删除,然后我的温度变成随机数。我的问题是,为什么在世界上预增量工作,但在 post 增量之后在该对象上调用析构函数?这是我的工作前增量:
Weather &Weather::operator++() {
++ptr->airTemperature;
return *this;
}
这是无效的 post 增量:
Weather Weather::operator++(int) {
Weather temp = *this;
++ptr->airTemperature;
return temp;
}
据我了解,预增量 returns 本身和 post 增量 returns 一个副本,所以我这样做了,但可能导致问题的原因是什么?
尝试这样的事情,你可以避免所有的复制构造函数和析构函数。
class Temp {
double airTemperature;
};
class Weather {
public:
Weather(std::shared_ptr<Temp> tempPtr)
: ptr(tempPtr){}
std::shared_ptr<Temp> ptr;
Weather Weather::operator++(int) {
Weather temp = *this;
++ptr->airTemperature;
return temp;
}
Weather &Weather::operator++() {
++ptr->airTemperature;
return *this;
}
};
当然要考虑你是否真的需要一个指向Temp的指针。也许你应该这样做。
class Weather {
public:
Weather(Temp temp)
: temp(temp){}
Temp ptr;
Weather Weather::operator++(int) {
Weather temp = *this;
++temp.airTemperature;
return temp;
}
Weather &Weather::operator++() {
++temp.airTemperature;
return *this;
}
};