naofuieu 0 Denunciar post Postado Maio 21, 2009 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
_Isis_ 202 Denunciar post Postado Maio 21, 2009 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
naofuieu 0 Denunciar post Postado Maio 21, 2009 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
VictorCacciari 42 Denunciar post Postado Maio 21, 2009 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
naofuieu 0 Denunciar post Postado Maio 22, 2009 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