Pergunta

Não consigo entender o que está acontecendo lá. Usando o Visual Studio 2008, eu defini uma enumeração como esta:

enum MyType{
    A,
    B,
    C
};

Então eu o uso para inicializar uma variável de membro:

class MyClass
{
    private:
        bool   bit_;
        uint16 num_;
        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // This the assignment which fails
        } // Here, there's a breakpoint to query member_ value    
};

MyClass Instância = new MyClass ();

Estou usando a configuração de depuração, portanto, nenhuma otimização pode me enganar ao ler uma variável. Em um ponto de interrupção logo após a tarefa, o depurador mostra o valor de membro_ como member_ = C.

Pode ser um problema de depurador Whatch Refresh, mas, dentro de um método, ele avalia verdadeiro ao verificar:

if(member_ == C){
    // ??
}

E também, atribuir aos outros valores fornece números estranhos, por exemplo, fazendo member_ = Bmember_ = 258 Ao ferrar. Você pode me dizer o que há de errado? Desde já, obrigado.

Editar #1

Eu notei um efeito engraçado que explica por que depois de atribuir member_ = A a expressão member_ == C avalia para true Para a enumeração com os valores padrão:

Para a enumeração

enum MyType{ A, B, C}; // equivalent to enum MyType{ A = 0, B = 1, C = 2};

eu recebo

MyType  a = A; // but when fetching a the value is   2  (0x0002)  thats the map for C!
MyType  b = B; // but when fetching a the value is 258  (0x0102)
MyType  c = C; // but when fetching a the value is 514  (0x0202)

Mas se eu fizer

enum MyType{ A = 5, B = 6, C = 7};

eu recebo

MyType  a = A; // but when fetching a the value is 1282  (0x0502)
MyType  b = B; // but when fetching a the value is 1538  (0x0602)
MyType  c = C; // but when fetching a the value is 1794  (0x0702)

Então, ao atribuir esse #?!

Btw, fazendo o tipo de member_ ser int em vez de MyType Não muda nada.

Editar #2Adicionou mais dois membros à classe, que são a causa real do problema. Postarei a resposta assim que a restrição de tempo desaparecer (8h a partir da publicação da pergunta).

Foi útil?

Solução 2

Obrigado a todos. Alguém no trabalho me apontou para a origem do problema.

É uma questão de configuração defeituosa do projeto, que fornece problemas de alinhamento de dados.

Após a compilação, com as configurações atuais do projeto, os dois primeiros membros da classe são 3 bytes de tamanho.

Deve ser 4 bytes, daí o desalinhamento de 1 byte. O extra adicionado é o lixo no byte desalinhado; portanto, todo o efeito é mudar um byte e adicionar 2.

Esse efeito é cancelado, adicionando um membro extra, embora não seja uma solução elegante (a solução é configurar o projeto com coragem).

class MyClass
{
    private:
        bool   bit_;  // 1 byte
        uint16 num_;  // 2 byte

        bool dummy;   // extra byte to help the alignment

        MyType member_;
    public:
        MyClass(MyType value){
            member_ = value; // Now it works as expected.
        }
};

Outras dicas

As entradas da enum não precisam ter valores exclusivos. Você pode ter uma enumeração com A, B, C, onde A e C são iguais a '42'. Nesse caso, quando o var tem valor de 42, o IDE Vou mostrar apenas um Das entradas correspondentes, A ou C, não ambas.

Você pode criar facilmente uma enumeração com entradas 'duplicadas', assim:

enum { A=1, B=1, C=1 }

Mas provavelmente, você não fez assim. No entanto, ao usar o número automático, você pode acidentalmente (ou intencionalmente) criar duplicatas também:

enum { A, B, C }       // 0,1,2
enum { A, B, C=0 }     // 0,1,0
enum { A=2, B=1, C }   // 2,1,2
enum { A=-1, B, C=0 }  // -1,0,0

Certifique-se de verificar novamente sua definição de enum.

veja ie http://www.learncpp.com/cpp-tutorial/45-enumerated-types/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top