Ich habe Probleme, die Verwendung intelligenter Zeiger als Klassenmitglieder in C ++ 11 zu verstehen. Ich habe viel über intelligente Zeiger gelesen und glaube zu verstehen, wie unique_ptr
und shared_ptr
/ oder wie ich weak_ptr
im Allgemeinen arbeite. Was ich nicht verstehe, ist die tatsächliche Verwendung. Es scheint, als würde jeder empfehlen unique_ptr
, fast immer den Weg zu gehen. Aber wie würde ich so etwas umsetzen:
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...
}
Angenommen, ich möchte die Zeiger durch intelligente Zeiger ersetzen. A unique_ptr
würde wegen nicht funktionieren getDevice()
, oder? Das ist also die Zeit, in der ich shared_ptr
und benutze weak_ptr
? Keine Möglichkeit zu benutzen unique_ptr
? Scheint mir, dass es in den meisten Fällen shared_ptr
sinnvoller ist, wenn ich keinen Zeiger in einem wirklich kleinen Bereich verwende?
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...
}
Ist das der richtige Weg? Vielen Dank!
shared_ptr
ist in 8/10 Fällen korrekt. Die anderen 2/10 werden zwischen unique_ptr
und aufgeteilt weak_ptr
. Wird auch weak_ptr
allgemein verwendet, um Zirkelverweise zu brechen; Ich bin nicht sicher, ob Ihre Verwendung als korrekt angesehen wird.
device
Datenmitglied? Das muss man zuerst entscheiden.
unique_ptr
stattdessen einen verwenden und den Besitz aufgeben könnte , wenn ich den Konstruktor aufrufe, wenn ich weiß , dass ich ihn vorerst nicht mehr brauche. Aber als Designer der Settings
Klasse weiß ich nicht, ob der Anrufer auch eine Referenz behalten möchte. Möglicherweise wird das Gerät an vielen Orten verwendet. Ok, vielleicht ist das genau dein Punkt. In diesem Fall wäre ich nicht der alleinige Eigentümer, und dann würde ich wohl shared_ptr verwenden. Und: Smart Points ersetzen also Zeiger, aber keine Referenzen, oder?
device
an den Konstruktor von übergebensettings
haben, möchten Sie dennoch im aufrufenden Bereich oder nur über darauf verweisen könnensettings
? Wenn letzteresunique_ptr
nützlich ist. Haben Sie auch ein Szenario, in dem der Rückgabewert vongetDevice()
istnull
. Wenn nicht, geben Sie einfach eine Referenz zurück.