elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda en constructor copia
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda en constructor copia  (Leído 3,877 veces)
__fnx__

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Duda en constructor copia
« en: 30 Julio 2011, 21:20 pm »

Hola, os cuento mis paranoias con c++  :D

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. class CTest {
  7. private:
  8. int a;
  9. public:
  10. CTest() : a(0) {}
  11.  
  12. CTest(int d) : a(d) {}
  13.  
  14. // CTest(const CTest& obj) {
  15. // cout << "constructor copia invocado";
  16. // *this = obj;
  17. // }
  18.  
  19. CTest(CTest& obj) {
  20. cout << "constructor copia sin const invocado";
  21. *this = obj;
  22. }
  23.  
  24. CTest& operator=(const CTest& obj) {
  25. a = obj.a;
  26. cout << "operator= invocado";
  27. return *this;
  28. }
  29.  
  30. int getA() {
  31. return this->a;
  32. }
  33. };
  34.  
  35. int main() {
  36.       CTest miObj = CTest();  /////////////////  AQUÍ ESTÁ EL ERROR
  37. cout << miObj.getA() << endl;
  38.  
  39. return 0;
  40. }
  41.  

El error:

../src/OtroCpp.cpp:36: error: no matching function for call to 'CTest::CTest(CTest)'

Según leo en el libro que estoy estudiando:

CTest miObj = CTest()

Es equivalente a

CTest miObj;

Ahora bien, si veis mi código, no funciona por culpa de poner el constructor copia con el parámetro no const, pero si quito los comentarios del constructor copia con const (el que implementa C++ por omisión) entonces funciona.

¿Por qué?

Y lo que me parece más raro todavía, es que al depurar el código y seguir instrucción a instrucción, veo que no llega a entrar en ningún momento en el constructor copia (en ninguno de los dos) y que se ejecuta directamente el constructor sin parámetros.

Al poner CTest  miObj = CTest() se llama al constructor copia? o no... pensando un poquito sobre el tema puedo entender con mis escasos conocimientos, que Ctest() crea un objeto sin nombre y lo copia a MiObj invocando al constructor copia, pero es que según mi depurador no es así.

En fin... ¿qué no soy capaz de ver/entender?

Gracias chic@s


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Duda en constructor copia
« Respuesta #1 en: 30 Julio 2011, 21:58 pm »

No recuerdo mucho de C++, ¿pero no sería así?


Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. class CTest {
  7. private:
  8. int a;
  9. public:
  10. CTest() : a(0) {}
  11.  
  12. CTest(int d) : a(d) {}
  13.  
  14.    CTest(const CTest& obj) {
  15.        cout << "constructor copia invocado";
  16.        *this = obj;
  17.    }
  18.  
  19. CTest(CTest& obj) {
  20. cout << "constructor copia sin const invocado";
  21. *this = obj;
  22. }
  23.  
  24. CTest& operator=(const CTest& obj) {
  25. a = obj.a;
  26. cout << "operator= invocado";
  27. return *this;
  28. }
  29.  
  30. int getA() {
  31. return this->a;
  32. }
  33. };
  34.  
  35. int main() {
  36.       CTest miObj; //CTest();  /////////////////  AQUÍ ESTÁ EL ERROR
  37. cout << miObj.getA() << endl;
  38.  
  39. return 0;
  40. }
  41.  

Si quieres crear un puntero:

Código
  1. CTest *miObj = new CTest();

Saludos.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
__fnx__

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Duda en constructor copia
« Respuesta #2 en: 30 Julio 2011, 23:26 pm »

Hola Leo, gracias por responder.

El caso es que según el libro es lo mismo.

Mira, esto también funciona:

Código
  1.  
  2. #include <iostream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. class CTest {
  8. private:
  9. int a;
  10. public:
  11. CTest() : a(0) {}
  12.  
  13. CTest(int d) : a(d) {}
  14.  
  15. CTest(const CTest& obj) {
  16. cout << "constructor copia invocado";
  17. *this = obj;
  18. }
  19.  
  20. CTest(CTest& obj) {
  21. cout << "constructor copia sin const invocado";
  22. *this = obj;
  23. }
  24.  
  25. CTest& operator=(const CTest& obj) {
  26. a = obj.a;
  27. cout << "operator= invocado";
  28. return *this;
  29. }
  30.  
  31. int getA() {
  32. return this->a;
  33. }
  34. };
  35.  
  36. int main() {
  37. CTest miObj = CTest();
  38. cout << miObj.getA() << endl;
  39.  
  40. return 0;
  41. }
  42.  


El problema está cuando quito el constructor copia que recibe la referencia al objeto constante, es decir como puse en el anterior post.

Bueno, haciendo más pruebas, si quito este constructor copia:
Código
  1. CTest(CTest& obj) {
  2. cout << "constructor copia sin const invocado";
  3. *this = obj;
  4. }
  5.  

Entonces ya funciona todo normalmente.

Lo que saco en claro es que si pongo este último, tengo que poner este otro:

Código
  1. CTest(const CTest& obj) {
  2. cout << "constructor copia sin const invocado";
  3. *this = obj;
  4. }
  5.  

Pero como digo, no lo llega a ejecutar (por las pruebas que obtengo depurándolo o con la ejecución, mensajes cout ).

¿Qué raro no?
En línea

__fnx__

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Duda en constructor copia
« Respuesta #3 en: 2 Agosto 2011, 13:03 pm »

Con Visual Studio funciona bien :xD
En línea

El_Java

Desconectado Desconectado

Mensajes: 144



Ver Perfil WWW
Re: Duda en constructor copia
« Respuesta #4 en: 3 Agosto 2011, 01:25 am »

A mi no me da ningun tipo de error, he uso Codeblocks en Ubuntu con g++ :)
En línea

Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: Duda en constructor copia
« Respuesta #5 en: 3 Agosto 2011, 03:16 am »

Citar
The copy constructor takes a reference to a const parameter. It is const to guarantee that the copy constructor doesn't change it, and it is a reference because a value parameter would require making a copy, which would invoke the copy constructor, which would make a copy of its parameter, which would invoke the copy constructor, which ...

acá tenés más info.

S2
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda array en constructor
Java
KaRaLLo 4 16,371 Último mensaje 23 Enero 2012, 01:59 am
por leogtz
Constructor (String numero) copia cifras a un Array. AYUDA PORFAVOR
Java
chriwasch 0 1,786 Último mensaje 7 Enero 2014, 13:32 pm
por chriwasch
Problema con constructor de copia C++
Programación C/C++
Ana25 1 1,610 Último mensaje 10 Enero 2014, 22:49 pm
por amchacon
Problema con constructor de copia c++
Programación C/C++
Ana25 0 1,516 Último mensaje 10 Enero 2014, 22:53 pm
por Ana25
C++ OOP constructor implicito - ¿se crea automaticamente un constructor implicit
Programación C/C++
GisiNA 2 2,939 Último mensaje 13 Abril 2017, 21:24 pm
por GisiNA
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines