Pergunta

Estou tentando inicializar uma variedade de objetos:

SinglyLinkedList offeredClasses[22] = {SinglyLinkedList("CSCE101"),SinglyLinkedList("CSCE101L"),SinglyLinkedList("CSCE150E"),SinglyLinkedList("CSCE150EL"),SinglyLinkedList("CSCE150EM"),SinglyLinkedList("CSCE150EML"),SinglyLinkedList("CSCE155"),SinglyLinkedList("CSCE155H"),SinglyLinkedList("CSCE156"),SinglyLinkedList("CSCE230"),SinglyLinkedList("CSCE230L"),SinglyLinkedList("CSCE235"),SinglyLinkedList("CSCE251"),SinglyLinkedList("CSCE310"),SinglyLinkedList("CSCE322"),SinglyLinkedList("CSCE361"),SinglyLinkedList("CSCE351"),SinglyLinkedList("CSCE451"),SinglyLinkedList("CSCE423"),SinglyLinkedList("CSCE428"),SinglyLinkedList("CSCE486"),SinglyLinkedList("CSCE487")};

Mas quando tento fazer isso, ele continua tentando chamar meu construtor de cópias em vez de um construtor sobrecarregado. Alguma idéia para consertar isso?

Os 2 construtores em questão são:

SinglyLinkedList(string course); //Constructor
SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

Preciso do construtor de cópias para outras coisas, para que eu não possa removê -lo.

Obrigado pela ajuda!

Foi útil?

Solução

Parece que seu compilador está seriamente quebrado. O seu constitutor de cópia é declarado com um parâmetro de referência que não é consultoso. Tal constitui de cópia não pode ser invocado com objeto temporário como um argumento, uma vez que uma referência não consultiva não pode ser vinculada a um objeto temporário.

Seus inicializadores são objetos temporários, o que significa que não há absolutamente nenhuma maneira de que um constitutor de cópias possa ser chamado aqui. Se o seu compilador fizer isso, significa que ele está quebrado ou que você está usando algum conjunto de configurações que o fazem se comportar de uma maneira estranha e não compatível. Qual compilador você está usando?

Essa é a primeira parte da resposta.

A segunda parte é que as listas inicializadors do inicializador são interpretadas como inicialização de cópias no C ++. Em outras palavras, o constitui devo ser chamado neste caso. Não há como contornar isso (a chamada pode ser otimizada posteriormente, mas o construtor deve estar disponível em qualquer caso). Nesse sentido, seu compilador está se comportando "corretamente", ou seja, ele tenta chamar o copiador, como deveria. Exceto que, como eu disse acima, no seu caso, ele deve emitir um erro (já que o construtor de cópias não é chamável) em vez de chamá-lo de queda.

E, finalmente, a terceira parte da resposta.

Você está dizendo que o constitui de cópia é chamado em vez de do construtor de conversão. Na realidade, Ambas são chamados. Se você olhar com cuidado, você verá. Em primeiro lugar, o conversão O construtor é chamado para criar um objeto temporário intermediário do tipo 'singlylinkedlist' da string que você forneceu (que envolve a construção de um objeto temporário 'std :: string' também) e, em seguida, o copiador é chamado para inicializar O elemento da matriz do temporário (isso acontece para cada elemento na matriz). É assim que deve ser no C ++, assumindo que seu copiador de cópia seja declarado corretamente, ou seja, com um parâmetro de referência const. Mas com o parâmetro de referência que não é consultoso, o constitutor de cópias não é chamável e o código é mal formado.

Outras dicas

Quando você tem construtores de argumento único, sempre os declaram explicit, por exemplo

explicit SinglyLinkedList(string course); //Constructor
explicit SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

Dessa forma, você tem mais chances de chamar o construtor certo.

Por outro lado, o compilador do construtor está procurando é SinglyLinkedList( const char* ). Tente criar a instância da string diretamente, por exemplo SinglyLinkedList( string("CSCE101") )

A assinatura dos construtores que você está chamando é SinglyLinkedList (Char Const *)

Que você não forneceu, por isso, produz um construtoTr tomando char const* ou chama -os de singlyLinkedList (String ("CSCE101"))

Não há conversão implícita de char* para std :: string - então seu compilador precisa ver quais correspondências de sobrecarga e encontra correspondência de singlyLinkedList.

Você pode tentar alterar suas declarações de construtor para:

explicit SinglyLinkedList(std::string const& name);
SinglyLinkedList(SinglyLinkedList const& other);

Em seguida, adicione o operador de tarefas e o destruidor:

~SinglyLinkedList();
SinglyLinkedList& operator=(SinglyLinkedList const& other);

Estou surpreso que esteja compilando, pois sem o constOs dois construtores devem ser ambíguos.

O que você precisa do construtor de cópias que não é a construção de cópias? Se você precisar de outra coisa, precisará mudar essa outra coisa. É realmente difícil entender o código, mesmo que você ignore problemas como está sofrendo atualmente. Esse é o mesmo problema que as pessoas causam nas bibliotecas de matemática, fazendo coisas como o operador de sobrecarga^ para fazer um produto cruzado.

Use as coisas para o que elas devem ser usadas e evite problemas posteriores, tornando seu código muitas vezes mais sustentável.

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