Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: __fnx__ en 30 Julio 2011, 21:20 pm



Título: Duda en constructor copia
Publicado por: __fnx__ 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


Título: Re: Duda en constructor copia
Publicado por: leogtz 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.


Título: Re: Duda en constructor copia
Publicado por: __fnx__ 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?


Título: Re: Duda en constructor copia
Publicado por: __fnx__ en 2 Agosto 2011, 13:03 pm
Con Visual Studio funciona bien :xD


Título: Re: Duda en constructor copia
Publicado por: El_Java en 3 Agosto 2011, 01:25 am
A mi no me da ningun tipo de error, he uso Codeblocks en Ubuntu con g++ :)


Título: Re: Duda en constructor copia
Publicado por: Karman 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á (http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html) tenés más info.

S2