für pädagogische Zwecke, war ich bereits heute eine Wrapper-Klasse Implementierung unten definiert (dies wird aus einem Buch entnommen):Einfache Wrapper-Klasse vs. Smart-Pointer
#ifndef WRAPPER_H
#define WRAPPER_H
template<class T>
class Wrapper
{
public:
Wrapper()
{ dataPtr = 0; }
Wrapper(const T& inner)
{
dataPtr = inner.clone();
}
Wrapper(const Wrapper<T> &original)
{
if (original.dataPtr != 0)
dataPtr = original.dataPtr->clone();
else
dataPtr = 0;
}
Wrapper &operator =(const Wrapper<T> &original)
{
if (this != &original)
{
if (dataPtr != 0)
delete dataPtr;
dataPtr = (original.dataPtr !=0) ? original.dataPtr->clone() : 0;
}
return *this;
}
~Wrapper()
{
if (dataPtr != 0)
delete dataPtr;
}
T &operator*()
{
return *dataPtr;
}
const T&operator*() const
{
return *dataPtr;
}
T *operator->()
{
return dataPtr;
}
const T * const operator->() const
{
return dataPtr;
}
private:
T *dataPtr;
};
#endif
Die Hauptidee ist als Zeiger zu handeln , mit dem zusätzlichen Vorteil der Speicherverwaltung, Kopierkonstruktor, Destruktor und Zuweisungsoperator. Es umschließt Klassen mit einer Klon-Methode: Sie geben einen Zeiger auf eine Kopie von sich selbst zurück (nicht zu sich selbst, zu einer neuen Kopie, die mit new
Class(*this)
erstellt wurde).
In gewisser Weise scheint es wie ein unique_ptr
, weil das umschlossene Objekt nur über diesen Wrapper zugänglich ist. Es gibt einen Unterschied, um den es in meiner Frage geht. In dieser Wrapperklasse gibt es einen Konstruktor, der durch Akzeptieren eines Verweises auf ein Objekt der Klasse definiert wird, die umgebrochen wird (der erste Konstruktor im obigen Code).
Dies ist sehr praktisch. Nehmen wir an, wir haben die Klassen A
und B
, und der Konstruktor für B
nimmt Bezug auf eine Wrapper<A>
. Dann kann ich ein Objekt mit einem anderen Objekt B
konstruieren A
:
A object1;
B object2(A);
Dies liegt daran, object2
verwendet wird, ein Wrapper<A>
(dann an den Konstruktor B
) unter Verwendung des oben genannte Wrapper
Konstruktor zu konstruieren.
Ist es möglich, dies mit einem der Smartpointer in std::memory
zu tun? Mein Hauptziel ist hier Bildung, aber in der Praxis möchte ich das Rad nicht neu erfinden.
Kopierkonstruktor ist nicht für eindeutige Zeiger verfügbar, da sie nach einer Kopie nicht mehr eindeutig sind. Geteilte Zeiger sind stattdessen _copyable_, wobei die Kopie einfach die Tatsache durchsetzt, dass sie _die Eigentümerschaft des spitzen Objekts _miteinander teilen. – skypjack
Das sieht aus, als würde es tiefe Kopien machen, anstatt einen Zeiger zu teilen/zu bewegen. – user4581301
Sieht aus wie ein intrusive_ptr –