ฉันมีปัญหาในการทำความเข้าใจการใช้งานตัวชี้อัจฉริยะในฐานะสมาชิกคลาสใน C ++ 11 ฉันได้อ่านพอยน์เตอร์ที่ชาญฉลาดมากและฉันคิดว่าฉันเข้าใจวิธีการunique_ptr
และshared_ptr
/ หรือweak_ptr
ทำงานโดยทั่วไป สิ่งที่ฉันไม่เข้าใจคือการใช้งานจริง ดูเหมือนว่าทุกคนแนะนำให้ใช้unique_ptr
เป็นวิธีที่จะไปเกือบตลอดเวลา แต่ฉันจะใช้บางสิ่งเช่นนี้ได้อย่างไร:
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...
}
สมมติว่าฉันต้องการแทนที่พอยน์เตอร์ด้วยพอยน์เตอร์อัจฉริยะ unique_ptr
จะไม่ทำงานเพราะgetDevice()
ใช่มั้ย? ดังนั้นเวลาที่ฉันใช้shared_ptr
และweak_ptr
? ไม่มีวิธีใช้unique_ptr
? ดูเหมือนว่าฉันจะชอบในกรณีส่วนใหญ่shared_ptr
เหมาะสมกว่าถ้าฉันใช้ตัวชี้ในขอบเขตที่เล็กจริงๆ?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
นั่นเป็นวิธีที่จะไปไหม? ขอบคุณมาก ๆ!
shared_ptr
ถูกต้องในกรณี 8/10 อื่น ๆ ที่ 2/10 จะแยกระหว่างและunique_ptr
weak_ptr
นอกจากนี้ยังweak_ptr
ใช้เพื่อแยกการอ้างอิงแบบวงกลม; ฉันไม่แน่ใจว่าการใช้งานของคุณจะได้รับการพิจารณาว่าถูกต้อง
device
ข้อมูลสมาชิก คุณต้องตัดสินใจก่อนว่า
unique_ptr
แทนและให้สิทธิ์การเป็นเจ้าของเมื่อเรียกตัวสร้างถ้าฉันรู้ว่าตอนนี้ฉันไม่ต้องการมันอีกแล้ว แต่ในฐานะนักออกแบบของSettings
ชั้นฉันไม่ทราบว่าผู้โทรต้องการเก็บข้อมูลอ้างอิงด้วยหรือไม่ อาจจะใช้อุปกรณ์ในหลาย ๆ ที่ ตกลงอาจเป็นจุดของคุณ ในกรณีนั้นฉันจะไม่เป็นเจ้าของ แต่เพียงผู้เดียวและนั่นคือเมื่อฉันจะใช้ shared_ptr ฉันเดา และ: ดังนั้นคะแนนสมาร์ทจะแทนที่ตัวชี้ แต่ไม่ใช่การอ้างอิงใช่ไหม
device
ไปยังตัวสร้างของsettings
คุณต้องการที่จะยังสามารถอ้างถึงมันในขอบเขตการโทรหรือผ่านเพียงsettings
? หากหลังunique_ptr
มีประโยชน์ นอกจากนี้คุณมีสถานการณ์ที่ค่าตอบแทนของมีgetDevice()
null
ถ้าไม่ใช่เพียงแค่ส่งคืนการอ้างอิง