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

[SOLUCIONADO] Error C++ al intentar pasar objetos de clase deriavada a clase base

Estas en el tema de Error C++ al intentar pasar objetos de clase deriavada a clase base en el foro de C/C++ en Foros del Web. Muy buenas! No se si el titulo del tema explique bien el error pero tratare de explicarlo lo mejor que pueda. Tengo una clase base ...
  #1 (permalink)  
Antiguo 02/02/2014, 12:57
 
Fecha de Ingreso: mayo-2010
Mensajes: 12
Antigüedad: 13 años, 11 meses
Puntos: 0
Exclamación Error C++ al intentar pasar objetos de clase deriavada a clase base

Muy buenas! No se si el titulo del tema explique bien el error pero tratare de explicarlo lo mejor que pueda.

Tengo una clase base llamada Vehicle y una clase derivada llamada scooter. Posteriormente creo varios objetos de la clase scooter y, me pide el ejercicio, que cree un vector de punteros a objetos de tipo Vehicle y que asigne los punteros a los objetos scooter.

Dicho esto, aqui esta el codigo:

class Vehicle{
protected:
string brand, plate; //Deberia ser Private
public:
Vehicle(string b, string p) : brand (b), plate (p){}
string get_brand(){
return brand;
}
string get_plate(){
return plate;
}
void set_brand (string b1){
brand = b1;
}
virtual void print();
};

//Task 5

class Scooter : public Vehicle{
public:
Scooter(string b, string p) : Vehicle(brand,plate){}
virtual void print(){
cout << "Scooter " << brand << ", Plate: " << plate << endl;
}
};

int main(){
int n = 5;

Vehicle *vehicle[3*n+2];
int i = 0;

for (i=0; i<=n; i++){

ostringstream convert,convert1,convert2;
convert << "DU-CC" << n;
Scooter sc("Honda 110cc",convert.str());
vehicle[i] = static_cast<Vehicle*> (&sc);

}
return 0;
}


La verdad que estoy en proceso de aprendizaje y primera vez que tengo que trabajar con clases bases y derivadas, por lo que no se si lo que estoy haciendo es correcto. Estando asi, el error que me da es

undefined reference to ´vtable for Vehicle´
  #2 (permalink)  
Antiguo 02/02/2014, 19:29
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Error C++ al intentar pasar objetos de clase deriavada a clase base

En la clase vehicle dijiste que print() es virtual, pero no indicaste un cuerpo para la funcion, por ejemplo,
Código C++:
Ver original
  1. virtual void print() {}
Una opcion es definir a la clase base como abstracta, haciendo que el metodo print sea virtual puro asi:

Código C++:
Ver original
  1. virtual void print() = 0;
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 03/02/2014, 05:18
 
Fecha de Ingreso: mayo-2010
Mensajes: 12
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Error C++ al intentar pasar objetos de clase deriavada a clase base

Vale, muchas gracias.. funciono declarar la clase base como privada y ahora no me un error. Sin embargo no logro luego imprimir los datos.

Código C++:
Ver original
  1. #include<fstream>
  2. #include<iostream>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. class Satnav{
  7. private:
  8.    int serialNo;
  9. public:
  10.     Satnav(int sn) : serialNo(sn){}
  11.     string print (){
  12.         cout << "With navi# " << serialNo;
  13.     }
  14. };
  15. class Vehicle{
  16.  protected:
  17.     string brand, plate; //Deberia ser Private
  18.  public:
  19.     Vehicle(string b, string p) : brand (b), plate (p){}
  20.     string get_brand(){
  21.         return brand;
  22.     }
  23.     string get_plate(){
  24.         return plate;
  25.     }
  26.     void set_brand (string b1){
  27.         brand = b1;
  28.     }
  29.     virtual void print() = 0;
  30. };
  31.  
  32. //Task 5
  33.  
  34. class Scooter : public Vehicle{
  35. public:
  36.      Scooter(string b, string p) : Vehicle(brand,plate){}
  37.      virtual void print(){
  38.      cout << "Scooter " << brand << ", Plate: " << plate << endl;
  39.      }
  40. };
  41.  
  42. //Task 6
  43. class Car : public Vehicle{
  44. protected:
  45.     bool aircondition;
  46.     Satnav *navigation;
  47.  public:
  48.     Car(string b, string p, bool ac = 1, Satnav *n=NULL) : Vehicle(brand,plate), aircondition(ac), navigation(n){}
  49.     void set_navigation (Satnav *a){
  50.         navigation = a;
  51.     }
  52.     bool get_aircondition(){
  53.         return aircondition;
  54.     }
  55.     void no_aircondition(){
  56.         aircondition = 0;
  57.     }
  58.     void printCarData(){
  59.         cout << brand << ", plate" << plate;
  60.         if (aircondition == 0){
  61.             cout << ", no air condition";
  62.         }
  63.         else{
  64.             cout << ", with air condition";
  65.         }
  66.     }
  67. };
  68. //Task 7
  69. class Cabrio : public Car{
  70. public:
  71.     Cabrio(string b1, string p1, bool a, int *n) : Car(brand, plate, aircondition, navigation){}
  72.     virtual void print(){
  73.         cout << "Cabrio ";
  74.         printCarData();
  75.         cout << endl;
  76.     }
  77. };
  78. //Task 8
  79. class Hartop : public Car{
  80. private:
  81.     int seats;
  82. public:
  83.     Hartop(string b1, string p1, bool a, Satnav *n, int s) : Car(brand, plate, aircondition, navigation), seats(s){}
  84.     virtual void print(){
  85.     cout << "Hartop ";
  86.     printCarData();
  87.     cout << ", Seats:" << seats << endl;
  88.     }
  89. };
  90.  
  91. int main(){
  92.     int n = 5;
  93.  
  94.     Satnav nav1(1);
  95.     Satnav nav3(2);
  96.     Satnav *nav2 = &nav3;
  97.  
  98.     Vehicle *vehicle[3*n+2];
  99.     int i = 0;
  100.  
  101.     for (i=0; i<=n; i++){
  102.  
  103.         ostringstream convert,convert1,convert2;
  104.         convert << "DU-CC" << n;
  105.         Scooter sc("Honda 110cc",convert.str());
  106.         vehicle[i] = static_cast<Vehicle*> (&sc);
  107.  
  108.         convert1 << "DU-Z" << n;
  109.         Cabrio ca("BMW Z5",convert1.str(),1,0);
  110.         vehicle[i+1] = static_cast<Vehicle *> (&ca);
  111.  
  112.         convert2 << "DU-TA" << n;
  113.         Hartop ht ("Toyota Auris",convert2.str(),1,0,5);
  114.         vehicle[i+2] = static_cast<Vehicle *> (&ht);
  115.     }
  116.  
  117.     Hartop fg1("Ford Galaxy","DU-FG 1",1,&nav1,7);
  118.     Hartop fg3("Ford Galaxy","DU-FG 2",1,&nav3,7);
  119.     Hartop *fg2 = &fg3;
  120.  
  121.     vehicle[4] = reinterpret_cast<Vehicle*>(&fg1);
  122.     vehicle[5] = reinterpret_cast<Vehicle*>(&fg2);
  123.  
  124.     int j=0;
  125.     for (int j = 0; j <= 3*n+2; j++)
  126.       vehicle[j]->print();
  127.  
  128.    return 0;
  129. }

El programa compila pero parece que se quedara colgando en un bucle que no logro identificar.

Muchas gracias

Última edición por erikat; 03/02/2014 a las 05:33
  #4 (permalink)  
Antiguo 03/02/2014, 06:06
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Error C++ al intentar pasar objetos de clase deriavada a clase base

Hola:

¿Estas líneas?:

Código C++:
Ver original
  1. vehicle[i] = static_cast<Vehicle*> (&sc);
  2. vehicle[i+1] = static_cast<Vehicle *> (&ca);
  3. vehicle[i+2] = static_cast<Vehicle *> (&ht);
  4. vehicle[4] = reinterpret_cast<Vehicle*>(&fg1);
  5. vehicle[5] = reinterpret_cast<Vehicle*>(&fg2);

¿Es la forma de pasar los objetos de la clase derivada a la clase base?
Lo pregunto porque no lo sé, y parece un tema interesante.

Por otro lado, yo siempre hago el método clásico

Código C++:
Ver original
  1. vehicle [i+1] = new Scooter("YAMAHA","123456");
  2. vehicle[i+1]->print();

Por cierto, que tienes un fallo en los constructores:
Código C++:
Ver original
  1. Scooter(string b, string p) : Vehicle(brand,plate){}

debería ser:

Código C++:
Ver original
  1. Scooter(string b, string p) : Vehicle(b,p){}

(y así en los demás)
  #5 (permalink)  
Antiguo 03/02/2014, 06:22
 
Fecha de Ingreso: mayo-2010
Mensajes: 12
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Error C++ al intentar pasar objetos de clase deriavada a clase base

Cita:
Iniciado por dehm Ver Mensaje
Hola:

¿Estas líneas?:

Código C++:
Ver original
  1. vehicle[i] = static_cast<Vehicle*> (&sc);
  2. vehicle[i+1] = static_cast<Vehicle *> (&ca);
  3. vehicle[i+2] = static_cast<Vehicle *> (&ht);
  4. vehicle[4] = reinterpret_cast<Vehicle*>(&fg1);
  5. vehicle[5] = reinterpret_cast<Vehicle*>(&fg2);

¿Es la forma de pasar los objetos de la clase derivada a la clase base?
Lo pregunto porque no lo sé, y parece un tema interesante.

Por otro lado, yo siempre hago el método clásico

Código C++:
Ver original
  1. vehicle [i+1] = new Scooter("YAMAHA","123456");
  2. vehicle[i+1]->print();

Por cierto, que tienes un fallo en los constructores:
Código C++:
Ver original
  1. Scooter(string b, string p) : Vehicle(brand,plate){}

debería ser:

Código C++:
Ver original
  1. Scooter(string b, string p) : Vehicle(b,p){}

(y así en los demás)
Hola, gracias por tu respuesta,

bueno yo lo acabo de aprende y aun el programa no correo por lo que puedo estar 100% seguro pero segun lo que he investigado, si. Es la manera de manejar datos de una clase derivada como si fuesen de la clase base.

Muchas gracias por tus comentarios, los tomare en cuenta y a ver que pasa :)
  #6 (permalink)  
Antiguo 03/02/2014, 08:12
 
Fecha de Ingreso: mayo-2010
Mensajes: 12
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Error C++ al intentar pasar objetos de clase deriavada a clase base

Bueno ya la parte de las variables esta solucionada, y ya no se queda colgado pero sigue sin imprimir al usar el for

Código Python:
Ver original
  1. for (i=0; i<n; i++){
  2.         ostringstream convert,convert1,convert2;
  3.         convert << "DU-CC " << i+1;
  4.         Scooter sc("Honda 110cc",convert.str());
  5.         vehicle[i] = static_cast<Vehicle*> (&sc);
  6.         //vehicle[i]->print(); CON ESTA LINEA IMPRIME PERO NO ES EL OBJETIVO
  7.  
  8.         convert1 << "DU-Z " << i+1;
  9.         Cabrio ca("BMW Z5",convert1.str(),1,0);
  10.         vehicle[i+1] = static_cast<Vehicle *> (&ca);
  11.         //vehicle[i+1]->print();
  12.  
  13.         convert2 << "DU-TA " << i+1;
  14.         Hartop ht ("Toyota Auris",convert2.str(),1,0,5);
  15.         vehicle[i+2] = static_cast<Vehicle *> (&ht);
  16.         //vehicle[i+2]->print();
  17.     }
  18.  
  19.     Hartop fg1("Ford Galaxy","DU-FG 1",1,&nav1,7);
  20.     Hartop fg3("Ford Galaxy","DU-FG 2",1,&nav3,7);
  21.     Hartop *fg2 = &fg3;
  22.  
  23.     vehicle[4] = static_cast<Vehicle *> (&fg1);
  24.     vehicle[4]->print();
  25.     vehicle[5] = static_cast<Vehicle *> (fg2);
  26.     vehicle[5]->print();
  27.  
  28.     for (int i=0; i<(3*n+2); i++) //NO IMPRIME
  29.       vehicle[i]->print();

Da un error en la compilacion que dice: "pure virtual method called"

Agradeceria la ayuda :)

Etiquetas: clase, clases, ejercicio, int, objetos, punteros, string
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 15:30.