Pergunta

Eu tenho um C ++ / CLI invólucro .lib torno nativa e .h arquivos. Eu uso a classe AutoPtr bastante extensivamente na classe wrapper para gerenciar os objetos não gerenciados que crio para envolver. Eu atingido um obstáculo com o / operador de atribuição de cópia construtor.

Usando a classe AutoPtr do Sr. Kerr: http: //weblogs.asp.net/kennykerr/archive/2007/03/26/AutoPtr.aspx

Ele sugere a seguinte (nos comentários) para recriar o comportamento do operador de atribuição:

SomeManagedClass->NativePointer.Reset(new NativeType);

O que eu acredito é verdade. Mas quando eu compilar meu código:

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

- Eu recebo os seguintes erros:

C2662 de erro: 'WrapTest :: AutoPtr :: GetPointer': Não é possível converter 'this' ponteiro de 'Const WrapTest :: AutoPtr' para 'WrapTest :: AutoPtr%'

Alguém já experimentou problemas semelhantes?


Para mais fundo na resposta, eu removi a palavra-chave "const" a partir da assinatura. Eu sei que não é sorriu em cima em termos de correção de código para um ctor cópia, mas o CLR não gosto nada disso - uma espécie de desmente o CLR em seu núcleo com o gerenciamento de memória.

Gostaria de saber se é possível deixar a const na assinatura e, em seguida, usar GCHandle ou pin_ptr para se certificar de memória não se move em você durante a realização da cópia?

Foi útil?

Solução

Olhando para AutoPtr de Kenny Kerr, que transfere a propriedade em seu construtor - essencialmente um construtor "movimento" em vez de um construtor de cópia. Isto é análogo com std :: auto_ptr.

Se você realmente quer transferir a propriedade de RHS para este (ou seja, rhs sair sem ele NativeByteMessage), você precisa mudar sua ctor cópia em um ctor movimento.

Além disso, você precisa usar a sintaxe de inicialização;

// 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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top