Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

naofuieu

Construtor de cópia não é reconhecido...

Recommended Posts

Olá, galera.

Eu fiz o código a seguir pra testar uma coisa, mas acabei esbarrando num problema que eu não entendo por que existe...

Eu defini meu construtor de cópia (recebe uma referência) e passo uma instância da classe para esse construtor. Só que o compilador não reconhece que deve usar esse construtor...

 

O código é o seguinte:

#include <iostream>
using namespace std;
class A {
		public:
				int* b;

		public:
				A();
16.			 A(A&);
				~A();
				A& operator =(A&);
				A copy();
};

A::A() { b = new int; }
A::A(A& a) { b = new int; *b = *a.b; }
A::~A() { delete b; }

A& A::operator =(A& a) { delete b; b = new int; *b = *a.b; return *this; }
A A::copy() { A b(*this); return b; }

int main() {
		A a;
		A b;
26.	 A c(a);
		A d = b.copy();
		b = a;

		cout << *a.b << ' '<<*b.b<<' '<<*c.b<<' '<<*d.b<<endl;
		return 0;
}

A saída do compilador foi:

teste.cpp: In function 'int main()':
teste.cpp:26: error: no matching function for call to 'A::A(A)'
teste.cpp:16: note: candidates are: A::A(A&)

Alguém tem alguma idéia do que seja? Ou alguma explicação?

 

Falou http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que você vai escrever os métodos do mesmo jeito, escreva-os dentro da classe....

 

#include <iostream>
using namespace std;
class A {
	public:
			int* b;

	public:
			A() {
				b = new int;
			}

			A(const A& a) {
				b = new int;
				*b = *a.b;
			}

			~A() {
				delete b;
			}

			A& operator =(A& a) {
				delete b;
				b = new int;
				*b = *a.b;
				return *this;
			}

			A copy() {
				A b(*this);
				return b;
			}
};


int main() {
	A a;
	A b;
	A c(a);
	A d = b.copy();
	b = a;

	cout << *a.b << ' '<<*b.b<<' '<<*c.b<<' '<<*d.b<<endl;
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

A classe que eu escrevi é só pra um teste que eu quero fazer.

Não escrevo definição de classe e implementação de método em um mesmo arquivo. Defini as funções fora só pelo costume... :D

 

O que me intrigou mesmo foi que, ao compilar o código que você me deu, o compilador não reclamou do construtor de cópia...

Por quê aquele const A& fez tanta diferença?

Ou será que quem fez diferença foi essa definição interna do método?

 

Alguém me explica?

Obrigado http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

---------

Testei colocar o const no meu código e ele foi compilado... Alguém? http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tentou tirar o '&' e passar um ponteiro para a classe A?

 

A::A(A* a) { b = new int; b = a->b; }

sobre o 'const' eu também não sei...

Vou dar uma olhada no google

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tentou tirar o '&' e passar um ponteiro para a classe A?

 

A::A(A* a) { b = new int; b = a->b; }

sobre o 'const' eu também não sei...

Vou dar uma olhada no google

Assim eu sei que funciona, mas eu já comecei a programar minhas classes usando referência... Fica ruim de modificar.

Sem contar que é meio "feio" você mexer diretamente na memória...

 

Ah, e o teste que eu estava fazendo era pra saber como se comportavam as funções que retornam objetos e as que retornam referências, e quais as diferenças.

Fiz isso porque eu estava fazendo a burrice de retornar referências nas funções em que era preciso devolver um novo objeto. Burrice, porque ou eu retornava uma variável local (que ia ser destruída ao sair do escopo da função) ou desreferenciava um objeto alocado dinamicamente, que nunca teria seu destrutor chamado, já que eu o associava a uma referência e não podia mais usar delete... heheh <_<

 

No mais, eu só queria mesmo descobrir por que essa diferença toda só por conta de um const...

 

Valeu, povo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.