class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
- C++11爲咱們提供了shared_ptr、unique_ptr和weak_ptr這三種智能指針幫助咱們更方便安全的使用動態內存。它們都定義在memory頭文件中。智能指針的常見用法你們都應該很熟悉了,今天我想說一下智能指針做爲成員變量時的用法。好比上面這段代碼,我想類Settings中的Device指針換成智能指針,那麼getDevice應該是什麼樣的呢?
- 這裏主要的決定因素是你Device對象的全部權策略,即你想要誰去擁有它,決定它的生命期。若是隻有Settings對象擁有它,當Settings析構的時候你但願Device也自動被析構。那麼你須要用unique_ptr,此時Settings獨自擁有Device對象的,所以Device的析構就只有Settings負責。在這種狀況下,getDevice能夠返回一個引用。
#include <memory>
class Device {
};
class Settings {
std::unique_ptr<Device> device;
public:
Settings(std::unique_ptr<Device> d) {
device = std::move(d);
}
Device& getDevice() {
return *device;
}
};
int main() {
std::unique_ptr<Device> device(new Device());
Settings settings(std::move(device));
// ...
Device& myDevice = settings.getDevice();
// do something with myDevice...
}
- 若是你但願Device對象不僅是Settings所獨有,那麼就須要使用shared_ptr了。這樣直到全部擁有Device的對象都析構了以後,Device纔會析構。
#include <memory>
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> const& d) {
device = d;
}
std::shared_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device = std::make_shared<Device>();
Settings settings(device);
// ...
std::shared_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}