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

Problema con clases [C++]

Estas en el tema de Problema con clases [C++] en el foro de C/C++ en Foros del Web. Alguien me puede decir que le pasa a mi código. El principal problema es que no me funciona la clase Segmento ya que al introducir ...
  #1 (permalink)  
Antiguo 19/01/2013, 12:25
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Problema con clases [C++]

Alguien me puede decir que le pasa a mi código. El principal problema es que no me funciona la clase Segmento ya que al introducir la variable Segmento s1 me da error. Lo curioso es que la hice siguiendo los mismo pasos que la clase Punto la cual sí funciona. Por favor, respondedme rápido ya que el lunes tengo un examen.


Código C++:
Ver original
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. class Punto {
  7.     private:
  8.         double ejex, ejey;
  9.     public:
  10.         Punto();
  11.         Punto(double x, double y);
  12.         void SetP(double x, double y);
  13.         double GetX();
  14.         double GetY();
  15.         double distanciacon(Punto b);
  16. };
  17.  
  18. Punto::Punto(double x, double y)
  19. {
  20.     (*this).ejex=x;
  21.     (*this).ejey=y;
  22. }
  23.  
  24. Punto::Punto()
  25. {
  26.     (*this).ejex=0;
  27.     (*this).ejey=0;
  28. }
  29.  
  30. void Punto::SetP(double x, double y)
  31. {
  32.     (*this).ejex=x;
  33.     (*this).ejey=y;
  34. }
  35.  
  36. double Punto::GetX()
  37. {
  38.     return ejex;
  39. }
  40.  
  41. double Punto::GetY()
  42. {
  43.     return ejey;
  44. }
  45.  
  46. double Punto::distanciacon(Punto b)
  47. {
  48.  
  49.     return sqrt(pow((*this).ejex-b.ejex,2)+pow((*this).ejey-b.ejey,2));
  50. }
  51.  
  52. class Segmento{
  53.     private:
  54.         Punto p1, p2;
  55.  
  56.     public:
  57.         Segmento(Punto punto1, Punto punto2);
  58.         void SetS(Punto punto1, Punto punto2);
  59.         Punto GetP1() const;
  60.         Punto GetP2() const;
  61. };
  62.  
  63.  
  64. Segmento::Segmento(Punto punto1, Punto punto2)
  65. {
  66.     (*this).p1=punto1;
  67.     (*this).p2=punto2;
  68. }
  69.  
  70. void Segmento::SetS(Punto punto1, Punto punto2)
  71. {
  72.     (*this).p1=punto1;
  73.     (*this).p2=punto2;
  74. }
  75.  
  76. Punto Segmento::GetP1() const
  77. {
  78.     return p1;
  79. }
  80.  
  81. Punto Segmento::GetP2() const
  82. {
  83.     return p2;
  84. }
  85.  
  86. int main()
  87. {
  88.     Punto p1, p2;
  89.     double x1, x2, y1, y2;
  90.     cout << "Introduce un puntos: ";
  91.     cin >> x1 >> y1;
  92.     cout << "Introduce otro punto: ";
  93.     cin >> x2 >> y2;
  94.  
  95.     p1.SetP(x1,y1);
  96.     p2.SetP(x2,y2);
  97.  
  98.     Segmento s1;
  99.  
  100.  
  101. }
  #2 (permalink)  
Antiguo 19/01/2013, 12:29
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema con clases [C++]

Por si os sirve de algo, la clase segmento se tenía que basar en estos puntos.

1. Constructor a partir de dos puntos.
2. Consultas del valor de punto inicial y final.
3. Longitud del segmento.
4. Lectura de un segmento desde la entrada estándar.
5. Consultar si un punto se encuentra a la derecha o a la izquierda del segmento.
6. Consultar si dos segmentos se cruzan.

Y sí ya se que no están hechos todos.
  #3 (permalink)  
Antiguo 19/01/2013, 14:29
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con clases [C++]

El contructor de la clase segmento espera 2 argumentos

Código:
Segmento s1(p1, p2);
El contructor de la clase punto tiene 2 declaraciones de constructor: una con argumentos y otra sin argumentos, al declarar los puntos sin argumentos entiende que estas usando el constructor sin argumentos, pero el de la clase segmento solo tiene el constructor con argumentos.


"..el lunes tengo un examen..."

Todo a ultima hora, como debe ser :)

Saludos
vosk
  #4 (permalink)  
Antiguo 19/01/2013, 14:54
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema con clases [C++]

Gracias por responder, pero ahora puse Segmento s1(p1,p2) y se compila pero despues pongo s1.GetP1() y me da otro error. ¿Qué pasó ahora? xD.
  #5 (permalink)  
Antiguo 19/01/2013, 15:55
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con clases [C++]

A mi no me da ningun error:

Código:
Punto p1, p2, p3;
Segmento s1(p1, p2);

p3 = s1.GetP1();
El error que te da es de compilacion o de funcionamiento?

vosk
  #6 (permalink)  
Antiguo 20/01/2013, 07:14
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema con clases [C++]

Pero pongo "cout << p3" por ejemplo y me sale esto:
C:\Users\i\Desktop\Nueva carpeta\fsd\main.cpp||In function 'int main()':|
C:\Users\i\Desktop\Nueva carpeta\fsd\main.cpp|101|error: no match for 'operator<<' in 'std::cout << p3'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|108|note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|117|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|127|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|165|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|169|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|173|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\bits\ostream.tcc|91|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|180|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\bits\ostream.tcc|105|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|191|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|200|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|204|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|209|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|213|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|221|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\ostream|225|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4. 1\include\c++\bits\ostream.tcc|119|note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]|
||=== Build finished: 1 errors, 0 warnings ===|
  #7 (permalink)  
Antiguo 20/01/2013, 07:40
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con clases [C++]

p3 no puede salir por cout porque es un objeto, cout no tiene capacidad para decidir que tipo de dato debe mostrar; si quieres que p3 'salude al mundo' tendras que implementar un metodo para la clase Punto que muestre los datos que quiera, o llamar a GetX/Y para recuperar el valor del objeto y luego mostrarlo o hacer las operaciones que quieras.

Código:
//esto no vale, cout no puede saber que esto significa volcar ejex/ejey
cout << p3;

//esto si
double x, y;
x = p3.GetX();
y = p3.GetY();
printf("P3 = %.2f, %.2f", x, y);

//o implementas un metodo
Punto::dump() {
    printf("P3 = %.2f, %.2f", ejex, ejey);
}
//y lo llamas
p3.dump();
vosk
  #8 (permalink)  
Antiguo 20/01/2013, 07:42
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con clases [C++]

De echo si miras el reporte de errores te esta diciendo lo mismo: "...error: no match for 'operator<<' in 'std::cout << p3'...", es decir que en cout no existe << para el objeto p3: solucion no usar << en cout para el objeto p3 :)

vosk
  #9 (permalink)  
Antiguo 20/01/2013, 09:22
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con clases [C++]

Y me olvidaba de la tercera forma: sobrecargar el operador << para la clase punto

Código:
ostream& operator << (ostream &ost, Punto &p) {
    printf("%.2f, %.2f", p.GetX(), p.GetY());
    return ost;
}

cout << p3;
Si ejex/ejey estuvieran declarados como publicos podrias acceder a p.ejex para mostrarlo, como son privados necesitas recuperar los valores a traves de los metodos publicos.

Otra cosa: la funcion main es de tipo int, por lo tanto debe retornar un entero.

vosk

Etiquetas: clases, funcion, int
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 11:26.