Foros del Web » Programación para mayores de 30 ;) » C/C++ »

acceso a miembros privados

Estas en el tema de acceso a miembros privados en el foro de C/C++ en Foros del Web. Hola a todos, tengo un pequeño problema y que mejor lugar para exponerlo que este. bueno, mi problema es que tengo declarada una clase llamada ...
  #1 (permalink)  
Antiguo 22/01/2011, 10:27
 
Fecha de Ingreso: enero-2006
Mensajes: 76
Antigüedad: 18 años, 3 meses
Puntos: 1
acceso a miembros privados

Hola a todos, tengo un pequeño problema y que mejor lugar para exponerlo que este.

bueno, mi problema es que tengo declarada una clase llamada 'complejo', con dos atributos privados, 'real' e 'imaginario', con sus constructores y metodos, después tengo instanciado una plantilla de tipo 'vector', declarado un 'iterador' y en el main creo 3 objetos de la clase complejo, con unos valores que les he pasado en el constructor, despues los añado en el vector, miro el tamaño del vector y me dice que tengo 3 elementos, pero cuando hago un for desde el inicio del vector hasta el final, me da un error de compilacion cuando intento acceder al vector con el iterador para mostrarlo en pantalla.

voy a dejar el código completo y si pueden ayudarme lo agradeceria, la verdad es que estuve probando casi de todo, y no me funciono nada. Con enteros si que funciona, con datos de un strutc tambien funciona, ya que sus atributos son públicos, pero me da error con la clase.

el codigo está escrito en el compilador Builder c++, se que muchas veces no sigue el estandar, pero creo que no es por eso, lo que creo es que algo debo de estar haciendo mal.

Código PHP:
#include <string.h>
#include <iostream>
#include <conio.h>
#include<vector>

using namespace std;

class 
complejo
{
private:
    
double real;
        
double imag;

public:
    
complejo(double realdouble imag);
        
complejo (): real(0),imag(0){}
    
void establecer(doubledouble);
        
void imprimir();
    
void agregar(complejo);
    
void agregar(doubledouble);
};

complejo::complejo(double realdouble imag)
{
    
this->real=real;
        
this->imag=imag;
}
//fin del constructor con parametros

// metodos de la clase complejo
void complejo::establecer(double rdouble i)
{
    
real=r;
        
imag=i;
}
//fin de establecer

void complejo::imprimir()
{
    
cout << "el numero es "<< real << " + " << imag << "i" << endl;

}
//fin de imprimir

void complejo::agregar(complejo a)
{
   
real=real+a.real;
   
imag=imag+a.imag;
}
//fin de agregar

void complejo::agregar(double adouble b)
{
    
realreal a;
        
imagimag b;
}


int main(int argccharargv[])
{
   
complejo c1,c2,c3;
   
vector<complejo>miComplejo;
   
vector<complejo>::iterator it;

   
c2.establecer(2,1);
   
c1.establecer(3,3);
   
c3.establecer(4,6);

   
c1.imprimir();
   
c2.imprimir();
   
c3.imprimir();

   
miComplejo.push_back(c1);
   
miComplejo.push_back(c2);
   
miComplejo.push_back(c3);


   
cout << miComplejo.size();

   for (
it=miComplejo.begin();it!=miComplejo.end();it++)
   {
       
cout << (*it)->imprimir() << endl;
   }
   
   return 
0;

}
//fin del main 

Última edición por xonil; 22/01/2011 a las 10:32
  #2 (permalink)  
Antiguo 22/01/2011, 11:22
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: acceso a miembros privados

Por la manera en que creaste los objetos c1, c2 y c3, deberías llamar al método imprimir con el operador . (punto)

Código C++:
Ver original
  1. cout << (*it).imprimir() << endl;

Si me equivoco me corrigen porfavor .
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #3 (permalink)  
Antiguo 22/01/2011, 11:43
 
Fecha de Ingreso: enero-2006
Mensajes: 76
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: acceso a miembros privados

Cita:
Iniciado por spider_boy Ver Mensaje
Por la manera en que creaste los objetos c1, c2 y c3, deberías llamar al método imprimir con el operador . (punto)

Código C++:
Ver original
  1. cout << (*it).imprimir() << endl;

Si me equivoco me corrigen porfavor .

lo he probado en el Dev-C++ con el cambio (ya lo habia probado antes asi) y me sigue dando el mismo error, o por lo menos en la misma linea.

aqui el error que muestra el compilador de Dev-C++

78 K:\complejo en vector.cpp no match for 'operator<<' in 'std::cout << (+(&it)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = complejo*, _Container = std::vector<complejo, std::allocator<complejo> >]())->complejo::imprimir()'
  #4 (permalink)  
Antiguo 22/01/2011, 15:09
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: acceso a miembros privados

Hola:

imprimir() es un método void.

Intenta así:
Código C++:
Ver original
  1. for (it=miComplejo.begin();it!=miComplejo.end();it++)
  2.    {
  3.        (*it).imprimir();
  4.    }


saludos;

Nup_
  #5 (permalink)  
Antiguo 22/01/2011, 15:36
 
Fecha de Ingreso: enero-2006
Mensajes: 76
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: acceso a miembros privados

Cita:
Iniciado por nup_ Ver Mensaje
Hola:

imprimir() es un método void.

Intenta así:
Código C++:
Ver original
  1. for (it=miComplejo.begin();it!=miComplejo.end();it++)
  2.    {
  3.        (*it).imprimir();
  4.    }


saludos;

Nup_
sigue dandome error.

aqui el código como quedaria:

Código C++:
Ver original
  1. #include <string.h>
  2. #include <iostream>
  3. #include <conio.h>
  4. #include<vector>
  5.  
  6. using namespace std;
  7.  
  8. class complejo
  9. {
  10. private:
  11.     double real;
  12.         double imag;
  13.  
  14. public:
  15.     complejo(double real, double imag);
  16.         complejo (): real(0),imag(0){}
  17.     void establecer(double, double);
  18.         void imprimir();
  19.     void agregar(complejo);
  20.     void agregar(double, double);
  21. };
  22.  
  23. complejo::complejo(double real, double imag)
  24. {
  25.     this->real=real;
  26.         this->imag=imag;
  27. }//fin del constructor con parametros
  28.  
  29. // metodos de la clase complejo
  30. void complejo::establecer(double r, double i)
  31. {
  32.     real=r;
  33.         imag=i;
  34. }//fin de establecer
  35.  
  36. void complejo::imprimir()
  37. {
  38.     cout << "el numero es "<< real << " + " << imag << "i" << endl;
  39.  
  40. }//fin de imprimir
  41.  
  42. void complejo::agregar(complejo a)
  43. {
  44.    real=real+a.real;
  45.    imag=imag+a.imag;
  46. }//fin de agregar
  47.  
  48. void complejo::agregar(double a, double b)
  49. {
  50.     real= real + a;
  51.         imag= imag + b;
  52. }
  53.  
  54.  
  55. int main(int argc, char* argv[])
  56. {
  57.    complejo c1,c2,c3;
  58.    vector<complejo>miComplejo;
  59.    vector<complejo>::iterator it;
  60.  
  61.    c2.establecer(2,1);
  62.    c1.establecer(3,3);
  63.    c3.establecer(4,6);
  64.  
  65.    c1.imprimir();
  66.    c2.imprimir();
  67.    c3.imprimir();
  68.  
  69.    miComplejo.push_back(c1);
  70.    miComplejo.push_back(c2);
  71.    miComplejo.push_back(c3);
  72.  
  73.  
  74.    cout << miComplejo.size();
  75.  
  76.    for (it=miComplejo.begin();it!=miComplejo.end();it++)
  77.    {
  78.        cout << (*it).imprimir() << endl;
  79.    }
  80.    
  81.    return 0;
  82.  
  83. }//fin del main
  #6 (permalink)  
Antiguo 22/01/2011, 18:25
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: acceso a miembros privados

de todas formas
Código C++:
Ver original
  1. (*it).imprimir();
se puede escribir como
Código C++:
Ver original
  1. it->imprimir();
porque es una cosa muy común, y hacerlo de la 1º manera es muy engorroso (si es que piensan en todo)
  #7 (permalink)  
Antiguo 22/01/2011, 19:18
 
Fecha de Ingreso: enero-2006
Mensajes: 76
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: acceso a miembros privados

Cita:
Iniciado por stiwi222 Ver Mensaje
de todas formas
Código C++:
Ver original
  1. (*it).imprimir();
se puede escribir como
Código C++:
Ver original
  1. it->imprimir();
porque es una cosa muy común, y hacerlo de la 1º manera es muy engorroso (si es que piensan en todo)
tambien lo he probado, y sigue fallando en la compilacion.
  #8 (permalink)  
Antiguo 22/01/2011, 19:51
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: acceso a miembros privados

Hola:

Xonil, acabo de probar este código con g++ 4.4.3 y funciona correctamente.
Código C++:
Ver original
  1. #include <string.h>
  2. #include <iostream>
  3. //#include <conio.h>
  4. #include<vector>
  5.  
  6. using namespace std;
  7.  
  8. class complejo
  9. {
  10. private:
  11.     double real;
  12.         double imag;
  13.  
  14. public:
  15.     complejo(double real, double imag);
  16.         complejo (): real(0),imag(0){}
  17.     void establecer(double, double);
  18.         void imprimir();
  19.     void agregar(complejo);
  20.     void agregar(double, double);
  21. };
  22.  
  23. complejo::complejo(double real, double imag)
  24. {
  25.     this->real=real;
  26.         this->imag=imag;
  27. }//fin del constructor con parametros
  28.  
  29. // metodos de la clase complejo
  30. void complejo::establecer(double r, double i)
  31. {
  32.     real=r;
  33.         imag=i;
  34. }//fin de establecer
  35.  
  36. void complejo::imprimir()
  37. {
  38.     cout << "el numero es "<< real << " + " << imag << "i" << endl;
  39.  
  40. }//fin de imprimir
  41.  
  42. void complejo::agregar(complejo a)
  43. {
  44.    real=real+a.real;
  45.    imag=imag+a.imag;
  46. }//fin de agregar
  47.  
  48. void complejo::agregar(double a, double b)
  49. {
  50.     real= real + a;
  51.         imag= imag + b;
  52. }
  53.  
  54.  
  55. int main(int argc, char* argv[])
  56. {
  57.    complejo c1,c2,c3;
  58.    vector<complejo>miComplejo;
  59.    vector<complejo>::iterator it;
  60.  
  61.    c2.establecer(2,1);
  62.    c1.establecer(3,3);
  63.    c3.establecer(4,6);
  64.  
  65.    c1.imprimir();
  66.    c2.imprimir();
  67.    c3.imprimir();
  68.  
  69.    miComplejo.push_back(c1);
  70.    miComplejo.push_back(c2);
  71.    miComplejo.push_back(c3);
  72.  
  73.  
  74.    cout << miComplejo.size();
  75.  
  76.    for (it=miComplejo.begin();it!=miComplejo.end();it++)
  77.    {
  78.        it->imprimir();
  79.    }
  80.    
  81.    return 0;
  82.  
  83. }//fin del main

La salida q dá es esta:
nupser@homepc:/tmp$ g++ a.cpp
nupser@homepc:/tmp$ ./a.out
el numero es 3 + 3i
el numero es 2 + 1i
el numero es 4 + 6i
3el numero es 3 + 3i
el numero es 2 + 1i
el numero es 4 + 6i

si te fijas no es solamente cambiar
Código C++:
Ver original
  1. (*it)->imprimir()
por
Código C++:
Ver original
  1. it->imprimir()

sino cambiar TODA LA LÍNEA:
Código C++:
Ver original
  1. cout << (*it)->imprimir() << endl;
por
Código C++:
Ver original
  1. it->imprimir();
;

eso es porque imprimir() es un método void, es decir no devuelve nada, cout está esperando un parámetro y le estás pasando un método q no retorna nada. Por eso es el error.

saludos;

Nup_
  #9 (permalink)  
Antiguo 23/01/2011, 06:59
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: acceso a miembros privados

yo solo me referia a que era más cómodo ponerlo de esa manera, no que lo solucionara
  #10 (permalink)  
Antiguo 23/01/2011, 07:36
 
Fecha de Ingreso: enero-2006
Mensajes: 76
Antigüedad: 18 años, 3 meses
Puntos: 1
Respuesta: acceso a miembros privados

Cita:
Iniciado por nup_ Ver Mensaje
Hola:

Xonil, acabo de probar este código con g++ 4.4.3 y funciona correctamente.
Código C++:
Ver original
  1. #include <string.h>
  2. #include <iostream>
  3. //#include <conio.h>
  4. #include<vector>
  5.  
  6. using namespace std;
  7.  
  8. class complejo
  9. {
  10. private:
  11.     double real;
  12.         double imag;
  13.  
  14. public:
  15.     complejo(double real, double imag);
  16.         complejo (): real(0),imag(0){}
  17.     void establecer(double, double);
  18.         void imprimir();
  19.     void agregar(complejo);
  20.     void agregar(double, double);
  21. };
  22.  
  23. complejo::complejo(double real, double imag)
  24. {
  25.     this->real=real;
  26.         this->imag=imag;
  27. }//fin del constructor con parametros
  28.  
  29. // metodos de la clase complejo
  30. void complejo::establecer(double r, double i)
  31. {
  32.     real=r;
  33.         imag=i;
  34. }//fin de establecer
  35.  
  36. void complejo::imprimir()
  37. {
  38.     cout << "el numero es "<< real << " + " << imag << "i" << endl;
  39.  
  40. }//fin de imprimir
  41.  
  42. void complejo::agregar(complejo a)
  43. {
  44.    real=real+a.real;
  45.    imag=imag+a.imag;
  46. }//fin de agregar
  47.  
  48. void complejo::agregar(double a, double b)
  49. {
  50.     real= real + a;
  51.         imag= imag + b;
  52. }
  53.  
  54.  
  55. int main(int argc, char* argv[])
  56. {
  57.    complejo c1,c2,c3;
  58.    vector<complejo>miComplejo;
  59.    vector<complejo>::iterator it;
  60.  
  61.    c2.establecer(2,1);
  62.    c1.establecer(3,3);
  63.    c3.establecer(4,6);
  64.  
  65.    c1.imprimir();
  66.    c2.imprimir();
  67.    c3.imprimir();
  68.  
  69.    miComplejo.push_back(c1);
  70.    miComplejo.push_back(c2);
  71.    miComplejo.push_back(c3);
  72.  
  73.  
  74.    cout << miComplejo.size();
  75.  
  76.    for (it=miComplejo.begin();it!=miComplejo.end();it++)
  77.    {
  78.        it->imprimir();
  79.    }
  80.    
  81.    return 0;
  82.  
  83. }//fin del main

La salida q dá es esta:
nupser@homepc:/tmp$ g++ a.cpp
nupser@homepc:/tmp$ ./a.out
el numero es 3 + 3i
el numero es 2 + 1i
el numero es 4 + 6i
3el numero es 3 + 3i
el numero es 2 + 1i
el numero es 4 + 6i

si te fijas no es solamente cambiar
Código C++:
Ver original
  1. (*it)->imprimir()
por
Código C++:
Ver original
  1. it->imprimir()

sino cambiar TODA LA LÍNEA:
Código C++:
Ver original
  1. cout << (*it)->imprimir() << endl;
por
Código C++:
Ver original
  1. it->imprimir();
;

eso es porque imprimir() es un método void, es decir no devuelve nada, cout está esperando un parámetro y le estás pasando un método q no retorna nada. Por eso es el error.

saludos;

Nup_
gracias Nup_ sabia donde postear :)

efectivamente, no tenia sentido lo que yo ponia, un cout que recibia otro cout, o un cout que recibia un void, osea nada o vacio.

ahora ya puedo seguir progresando con la biblioteca estandar.

Etiquetas: privados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:14.