Pergunta

Eu queria saber por que um erro como esse ocorreria.

no matching function for call to 'Foo::Foo()'

no código para um construtor de cópia? Suponha que Foo seja apenas um objeto com campos normais (sem memória alocada dinamicamente etc.), e o único construtor que ele definiu é um construtor que leva um argumento.

Eu nem sabia que o construtor precisava ser considerado. Se o código disser algo como

bar = thing.bar; //

E o bar é do tipo foo, com as especificações descritas acima, não deve apenas gerar uma cópia rasa e ser feita com ela? Por que um construtor padrão precisa ser invocado?

Foi útil?

Solução

Se você não definir um construtor, o compilador gerará um construtor padrão, no entanto, se você Faz Defina um construtor (como um construtor de cópia) o compilador não vai Gere o construtor padrão, para que você também precise definir esse construtor.

Outras dicas

Parece que você definiu o construtor de cópias sem definir nenhum outro construtor.

Depois de declarar um construtor explicitamente, o compilador não fornece mais um construtor padrão para você. Consequentemente, você não tem mais um mecanismo para construir um objeto da classe em primeiro lugar (e, portanto, não seria capaz de copiá -lo).

Se, como você diz, você está fazendo "algo como

bar = thing.bar;

é presumivelmente no corpo da cópia da sua classe - então o bar O campo é inicializado com o CTOR padrão de sua classe primeiro e depois usa o operador de atribuição dessa classe para esta instrução. Se barA classe tem apenas uma cópia, sem ctor padrão, você precisará adicionar um bar(thing.bar) cláusula antes da Abertura da cópia da sua classe { e remova essa tarefa (geralmente uma boa idéia de qualquer maneira, mas obrigatória sob a condição "sem ctor padrão").

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