In Java
wrapper.set_state(new Medium());
schafft eine neue Referenz gezählt, zB von Medium und leitet sie durch Bezugnahme auf Wrapper die set_state Funktion.
in C++ der obigen Code technisch gültig ist, würde in der Wrapper-Klasse set_state definiert werden als:
void set_state(Medium* medium);
Aber was würden Sie tun, eine Nicht-Referenz gezählt Zeiger auf eine neue Instanz von Medium ist vorbei . Sie wären dafür verantwortlich, dass es später delete
d ist. Wenn alle set_state dies tat, war:
void set_state(Medium* medium)
{
this->medium = medium;
}
Sie würden jedes Mal, wenn ein Speicherleck einführen einen zweiten Anruf gemacht SET_STATE. Wenn Sie in C++ einen solchen rohen Zeiger überschreiben, gibt es keine Referenzzählung. Wenn niemand mehr auf die Zuteilung zeigt, ist die Zuteilung verloren gegangen.
Sie könnten es vorziehen, ein Objekt als Verweis weitergeben müssen:
void set_state(const Medium& medium)
{
this->medium = medium; // copy
}
über aufgerufen:
Medium m;
// populate m
wrapper.set_state(m);
// or
wrapper.set_state(Medium());
oder Sie nach Wert übergeben können:
void set_state(Medium medium)
{
this->medium = medium; // copy
}
// invocation:
Medium m;
// populate m
wrapper.set_state(m); // copy
Obwohl dies ein Exemplar In einigen Fällen ist der Compiler in der Lage, eine der Kopien auszugeben (siehe http://ideone.com/gNICYt)
Wenn Sie unbedingt einen Zeiger verwenden müssen (mehrere Dinge verweisen genau auf die mittlere Instanz), sollten Sie die Verwendung von std::shared_ptr
in Betracht ziehen, die eine Referenzzählung bietet.
#include <memory>
struct Medium {};
class Wrapper {
std::shared_ptr<Medium> medium;
public:
void set_state(std::shared_ptr<Medium> medium) {
this->medium = medium; // if we'd called it m_medium, or medium_
// we could just have written
// m_medium = medium; or medium_ = medium;
}
};
int main(void) {
Wrapper w;
w.set_state(std::make_shared<Medium>());
return 0;
}
Was Sie oben geschrieben haben, ist zufällig gültiger C++ - Code. –
In C++ ist nichts mit 'wrapper.set_state (Medium());' verkehrt. –
@SamVarshavchik Ahhhh, ok. Müsste ich das Objekt löschen? –