Frage

Ich habe einen C ++ / CLI-Wrapper um nativen LIB und H-Dateien. Ich benutze die AutoPtr Klasse ziemlich ausführlich in der Wrapper-Klasse, die nicht verwaltete Objekte, die ich für die Verpackung erstellen zu verwalten. Ich habe eine Straßensperre mit dem Copy-Konstruktor / Zuweisungsoperator getroffen.

Mit der AutoPtr Klasse von Herrn Kerr: http: //weblogs.asp.net/kennykerr/archive/2007/03/26/AutoPtr.aspx

Er schlägt vor, die folgenden (in den Kommentaren), um das Verhalten des Zuweisungsoperators neu zu erstellen:

SomeManagedClass->NativePointer.Reset(new NativeType);

Was ich glaube, ist wahr. Aber wenn ich meinen Code kompilieren:

ByteMessageWrap (const ByteMessageWrap% rhs)
{
     AutoPtr<ByteMessage> m_NativeByteMessage(rhs.m_NativeByteMessage.GetPointer());
};

ByteMessageWrap% operator=(const ByteMessageWrap% rhs)
{
     //SomeManagedClass->NativePointer.Reset(new NativeType);
     if (this == %rhs) // prevent assignment to self
        return *this;

     this->m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.GetPointer());
     return *this;
};

- Ich erhalte die folgenden Fehler:

  

Fehler C2662:   'WrapTest :: AutoPtr :: GetPointer':   kann nicht ‚dieses‘ Zeiger konvertieren von   'Const WrapTest :: AutoPtr' zu   'WrapTest :: AutoPtr%

Hat jemand ähnliche Probleme erlebt?


Für weitere Hintergrundinformationen über die Antwort, entfernte ich das „const“ Schlüsselwort aus der Signatur. Ich weiß, dass nicht auf in Form von Code Richtigkeit für eine Kopie Ctor lächelt, aber die CLR hat es nicht gefallen - eine Art die CLR in ihrem Kern mit Speicherverwaltung täuscht.

Ich frage mich, ob es möglich ist, die const in der Signatur zu verlassen und dann GCHandle verwenden oder pin_ptr sicher Speicher, um auf Sie bewegt sich nicht, während die Kopie durchführen?

War es hilfreich?

Lösung

Mit Blick auf Kenny Kerr AutoPtr, überträgt er das Eigentum an dem Konstruktor - im Wesentlichen eine „Bewegung“ Konstruktor, anstatt eine Kopie Konstruktor. Dies ist analog mit std :: auto_ptr.

Wenn Sie wirklich das Eigentum übertragen möchten von rhs dazu (das heißt verlassen rhs ohne es NativeByteMessage), müssen Sie Ihre Kopie Ctor in einen Zug Ctor ändern.

Auch Sie müssen Initialisierung Syntax verwenden;

// warning - code below doesn't work
ByteMessageWrap (ByteMessageWrap% rhs)
    : m_NativeByteMessage(rhs.m_NativeByteMessage); // take ownership
{
}

ByteMessageWrap% operator=(ByteMessageWrap% rhs)
{
     //SomeManagedClass->NativePointer.Reset(new NativeType);
     if (this == %rhs) // prevent assignment to self
        return *this;

     m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.Release());
     return *this;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top