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
때문에 A 가 작동하지 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의 경우 a 가 맞습니다. 다른 2/10 사이에 분할 unique_ptr
하고 weak_ptr
. 또한 weak_ptr
일반적으로 순환 참조를 끊는 데 사용됩니다. 귀하의 사용법이 올바른지 확실하지 않습니다.
device
데이터 멤버에 대해 어떤 소유권을 원 하십니까? 먼저 결정해야합니다.
unique_ptr
더 이상 필요하지 않다는 것을 알면 호출자 대신 대신 사용할 수 있고 생성자를 호출 할 때 소유권을 포기할 수 있음을 이해한다 . 그러나 Settings
클래스 디자이너로서 호출자가 참조를 유지 하려는지 여부를 알 수 없습니다. 어쩌면 장치는 여러 곳에서 사용될 것입니다. 좋아, 아마 그게 당신의 요점 일 것입니다. 이 경우 단독 소유자가 아니므로 shared_ptr을 사용할 것입니다. 그리고 : 똑똑한 점은 포인터를 대체하지만 참조는 대체하지 않습니다.
device
의 생성자에 전달한settings
후에도 호출 범위에서 또는 참조를 통해서만 참조 할 수settings
있습니까? 후자의 경우unique_ptr
유용합니다. 또한,의 반환 값은 어디 시나리오를 가지고 할getDevice()
것입니다null
. 그렇지 않은 경우 참조를 반환하십시오.