2009-07-16 2 views
0

У меня есть оболочка C++/CLI вокруг собственных .lib и .h файлов. Я использую класс AutoPtr довольно широко в классе-оболочке для управления неуправляемыми объектами, которые я создаю для упаковки. Я ударил блокпост с помощью оператора-конструктора копирования/назначения.AutoPtr в смешанном режиме C++/CLI

Использование класса AutoPtr г-Керр: http://weblogs.asp.net/kennykerr/archive/2007/03/26/AutoPtr.aspx

Он предлагает следующее (в комментариях), чтобы воссоздать поведение оператора присваивания:

SomeManagedClass->NativePointer.Reset(new NativeType); 

который я считаю, это верно. Но когда я компилирую мой код:

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; 
}; 

- я получаю следующие ошибки:

ошибка C2662: 'WrapTest :: AutoPtr :: GetPointer': не может преобразовать 'это' указатель из 'Const WrapTest :: AutoPtr' к ' WrapTest :: AutoPtr%'

кто-нибудь испытал подобные проблемы?


Для получения дополнительной информации об ответе, я удалил ключевое слово «const» из подписи. Я знаю, что это не улыбается с точки зрения правильности кода для копии ctor, но CLR ему совсем не нравится - вроде как противоречит CLR, в основе которого лежит управление памятью.

Интересно, можно ли оставить константу в сигнатуре, а затем использовать GCHandle или pin_ptr, чтобы убедиться, что память не перемещается во время выполнения копии?

+0

Для ясности я получаю эту ошибку в обеих строках кода, вызывающего метод GetPointer(). – TomO

+0

Хм ... Я все еще думаю об этом. Какое поведение вы действительно хотите? Вы хотите, чтобы исходное байтовое сообщение ByteMessage было отброшено или клонировано при копировании ByteMessage? Возможно, у ByteMessage не должно быть конструктора копирования, так как это управляемый класс - как насчет ICloneable? –

ответ

0

Рассматривая AutoPtr от Kenny Kerr, он передает право собственности в свой конструктор - по существу, вместо конструктора копирования - конструктор «move». Это аналогично std :: auto_ptr.

Если вы действительно хотите передать право собственности от rhs на это (то есть оставьте без него NativeByteMessage), вам необходимо сменить копию ctor на перемещение ctor.

Кроме того, вам необходимо использовать синтаксис инициализации;

// 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; 
}