У меня есть оболочка 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, чтобы убедиться, что память не перемещается во время выполнения копии?
Для ясности я получаю эту ошибку в обеих строках кода, вызывающего метод GetPointer(). – TomO
Хм ... Я все еще думаю об этом. Какое поведение вы действительно хотите? Вы хотите, чтобы исходное байтовое сообщение ByteMessage было отброшено или клонировано при копировании ByteMessage? Возможно, у ByteMessage не должно быть конструктора копирования, так как это управляемый класс - как насчет ICloneable? –