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_ptrund shared_ptr/ oder wie ich weak_ptrim 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_ptrwürde wegen nicht funktionieren getDevice(), oder? Das ist also die Zeit, in der ich shared_ptrund benutze weak_ptr? Keine Möglichkeit zu benutzen unique_ptr? Scheint mir, dass es in den meisten Fällen shared_ptrsinnvoller 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_ptrist in 8/10 Fällen korrekt. Die anderen 2/10 werden zwischen unique_ptrund aufgeteilt weak_ptr. Wird auch weak_ptrallgemein verwendet, um Zirkelverweise zu brechen; Ich bin nicht sicher, ob Ihre Verwendung als korrekt angesehen wird.
deviceDatenmitglied? Das muss man zuerst entscheiden.
unique_ptrstattdessen 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 SettingsKlasse 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?
devicean den Konstruktor von übergebensettingshaben, möchten Sie dennoch im aufrufenden Bereich oder nur über darauf verweisen könnensettings? Wenn letzteresunique_ptrnützlich ist. Haben Sie auch ein Szenario, in dem der Rückgabewert vongetDevice()istnull. Wenn nicht, geben Sie einfach eine Referenz zurück.