Verifiquei-o especialmente para si, tendo em conta
Está tudo bem DJ.
Que compilador utiliza?
Estou no VS 2010:
binário '=' : não foi encontrado nenhum operador que aceite um operando à direita do tipo 'A' (ou não há conversão aceitável)
p.s. Não percebo bem o que significa "com consideração"? Tratava-se da aceitabilidade de copiar implicitamente uma classe base para uma classe derivada.
No Visual Studio, o meu exemplo também funciona. Referia-me ao operador da cópia explícita e expliquei-o através do código.
Não estava a referir-me ao operador explícito. Estava a falar da inadmissibilidade do operador implícito neste caso a que chamou "estreiteza de visão" e não é assim.
Se precisar de fazer uma cópia, deve primeiro fazer o molde b explicitamente para o tipo correcto em C++. Para uma tal cópia é uma violação do encapsulamento de objectos. É por isso que não deve ser uma questão de implicação.
Referia-me a um operador de cópia explícita e expliquei-o em código.
A propósito, se a classe A também herdar de alguma classe X, então a sua classe B não está de modo algum protegida contra a cópia X (estamos a falar de MQL). Tem de escrever operadores para TODAS as classes-mãe.
Duvido que o compilador os separe (no contexto do código) em explícito e implícito. Caso contrário, seria fácil de reparar
A questão é que um operador implícito corresponde sempre ao tipo de um objecto. Ou seja, se um objecto é do tipo B, o seu operador implícito é do tipo const B&. Não é do tipo A. Mas este é do tipo C++.
Primeiro procura o operador B:::, se estiver ausente, então procura o operador A:::, se também estiver ausente, então considera o seu dever cumprido e não faz nada (embora o ponteiro esteja quebrado como resultado) :)
E, finalmente, tirar esse asterisco depois de B, magoa o olho ) Já descobriu tudo com este insecto.
Eu pessoalmente encontro variáveis de objectos sem asteriscos perturbadores )) Um dos insectos desagradáveis é escrever A a=novo A em vez de *a e não compreender o que está errado durante muito tempo) Eu, pelo contrário, mostrei que tudo funciona correctamente se seguir os seus conselhos e declarar uma op.=&. O editor irá produzir um erro neste caso de imediato. Fá-lo-ei dessa forma a partir de agora ))
As peculiaridades são duplamente conhecidas, mas não de tal forma que se alterar a ordem de adição (excepto pelos números relativamente muito diferentes), o resultado é diferente! Por favor explique a um idiota porque é que isto acontece aqui?
Verifiquei-o especialmente para si, tendo em conta
Está tudo bem DJ.
Que compilador utiliza?
Estou no VS 2010:
binário '=' : não foi encontrado nenhum operador que aceite um operando à direita do tipo 'A' (ou não há conversão aceitável)
p.s. Não percebo bem o que significa "com consideração"? Tratava-se da aceitabilidade de copiar implicitamente uma classe base para uma classe derivada.
No Visual Studio, o meu exemplo também funciona. Referia-me ao operador da cópia explícita e expliquei-o através do código.
Escrevi-o só por precaução, para que, se desactivar o explícito, não o desactive acidentalmente ao mesmo tempo
No Visual Studio, o meu exemplo também funciona. Referia-me ao operador da cópia explícita e expliquei-o através do código.
Não estava a referir-me ao operador explícito. Estava a falar da inadmissibilidade do operador implícito neste caso a que chamou "estreiteza de visão" e não é assim.
Se precisar de fazer uma cópia, deve primeiro fazer o molde b explicitamente para o tipo correcto em C++. Para uma tal cópia é uma violação do encapsulamento de objectos. É por isso que não deve ser uma questão de implicação.
Referia-me a um operador de cópia explícita e expliquei-o em código.
Duvido que o compilador os separe (no contexto do código) em explícito e implícito. Caso contrário, seria fácil de reparar
A propósito, o tipo de operador parece estar OK
Primeiro procura o operador B:::, se estiver ausente, então procura o operador A:::, se também estiver ausente, então considera o seu dever cumprido e não faz nada (embora o ponteiro esteja quebrado como resultado) :)
se também não estiver lá, então considera o seu dever cumprido e não faz nada (embora o ponteiro acabe por ser quebrado) :)
Porque é que não faz nada? Copia por operador implícito (automático)=(const A&), o que não deve fazer.
E finalmente remover esse asterisco depois de B, magoa os seus olhos ) Já descobrimos tudo com este insecto.
E, finalmente, tirar esse asterisco depois de B, magoa o olho ) Já descobriu tudo com este insecto.
Eu pessoalmente encontro variáveis de objectos sem asteriscos perturbadores )) Um dos insectos desagradáveis é escrever A a=novo A em vez de *a e não compreender o que está errado durante muito tempo) Eu, pelo contrário, mostrei que tudo funciona correctamente se seguir os seus conselhos e declarar uma op.=&. O editor irá produzir um erro neste caso de imediato. Fá-lo-ei dessa forma a partir de agora ))
As peculiaridades são duplamente conhecidas, mas não de tal forma que se alterar a ordem de adição (excepto pelos números relativamente muito diferentes), o resultado é diferente! Por favor explique a um idiota porque é que isto acontece aqui?
Basta olhar para as duas linhas inferiores da fonte.
Erro para programadores.
O guião não compila, identifica o porquê))))). Utilizar ficheiro anexo.
O mesmo ficheiro: