Declarar clase abstracta en c++

E

Editado

Saiko9

una clasa abstracta se hace haciendo todos sus métodos virtual (delegas todo a la clase derivada) si mal no recuerdo.

1 respuesta
E

#2 Menos el constructor los demás sí, correcto.

Pero eso me da igual, no afecta a mi duda (o al menos así lo entiendo yo).

EDIT: he cambiado algunas cosillas a ver si se entiende mejor

rafag

Yo estoy contigo. No creo que se pueda aprovechar el polimorfismo si no usas punteros o referencias.

BLZKZ

no lo recuerdo bien (hace demasiado de esto), podías declarar variables del tipo abstracto, para luego poderle endosar objetos de tipos derivados (vamos que heredan de ella)
Por ejemplo tiene la clase animal (abstracta) y luego declaras perro, gato y conejo que heredan de ella. Declaras una pila de clase animal, y puedes hacer push en la pila de objetos perro, gato o conejo indistintamente.

Funciona del mismo modo con listas/loquesea

Respondiendo a tu pregunta del principio... no, no puedes crear objetos de una clase abstracta, pero sí declarar variables o estructuras de datos de esa clase como tipo.

A modo ejemplo

 Atleta * javier  = new Velocista() 

Edit:

De todos modos creo que no necesitas punteros. Un array no deja de ser una colección de punteros, pero no recuerdo bien, ¿esto no te deja hacerlo el compilador?

Atleta atletas[max];
Velocista javier;
atletas[0] = javier;
r2d2rigo

#1 tu profesor no tiene ni idea, en C++ el polimorfismo solo se puede hacer con punteros/referencias: http://stackoverflow.com/questions/15188894/why-doesnt-polymorphism-work-without-pointers-references

1 respuesta
BLZKZ

#6 De todos modos lo mismo es que el usar polimorfismo y demás en la práctica es la locura, no sabemos ni qué le pide XD

E

Editado

1 respuesta
r2d2rigo

#8 lo que tiene delito es que useis Eclipse para C++.

4 1 respuesta
E

#9 puedes decirme alguna alternativa que no sea piratear visual? xD Porque ni la uni nos lo presta...

1 respuesta
B

#10 Con el express te da de sobra.

1 respuesta
E

#11 descargando pues. Ya os contaré

1 respuesta
r2d2rigo

#12 ojo, que si te piden que presentes el proyecto en Eclipse ciñete a el porque cada compilador funciona distinto. Y si quieres un VS gratis, hace poco han sacado el Community que tiene mas cosas que las Express y sigue siendo gratis: https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx

1 respuesta
E

#13 no, de hecho nos dijo que daba igual el ide que usasemos. Así que si va mejor el Vs que eclipse... porque el debug es... que asco.

E

Bueno, ya tengo casi toda la práctica hecha. Y digo casi porque hay una cosa que se me resiste.

Tengo un set con punteros a mi clase abstracta Marca

typedef set<Marca *, classcomp> marcas;

El comparador:

struct classcomp {
    bool operator() (const Marca* marca1, const Marca* marca2) {
    	return marca1 < marca2;
    }
};

Y el operador <

bool operator< (const Marca &marca1, const Marca &marca2) {

Marca * m1 = const_cast<Marca *>(&marca1);
Marca * m2 = const_cast<Marca *>(&marca2);

return (m1->getValor() < m2->getValor());
}

Pues nada, que no hay forma de que me los ordene xD

shaba

hace tiempo que no hago c++ así que no estoy muy seguro
http://stackoverflow.com/questions/13234106/order-of-elements-in-set-of-pointers

bool operator< (const Marca* marca1, const Marca* marca2) const   {
      /* implement logic here */
        //Marca * m1 = const_cast<Marca *>(&marca1); 
        //Marca * m2 = const_cast<Marca *>(&marca2);

    return (marca1->getValor() < marca2->getValor()); // getValor() debería ser const, y no realizar const_cast
}
1 respuesta
E

#16 he probado de todo, con const, sin const, convirtiendo... xD nada de nada

shaba

pero has hecho el comparador con punteros?

ps: bueno si no es con punteros entonces te tendrá que ayudar otra persona :p

1 respuesta
E

#18 todo está con punteros, puse los sources arriba

1 respuesta
BLZKZ

#19 no tiene sentido lo que has hecho, comparas punteros y no valores WTF y para el comparador defines el operador () en lugar de == y lo metes en una estructura, no entiendo

3 respuestas
E

#20 comparo punteros porque mi estructura es de punteros. Y el operador es < no == ya que es para insertar ordenado en un set

rafag

Creo que a lo que se refiere #20 es que cuando haces

return marca1 < marca2;

estás comparando dos punteros, es decir, las direcciones de memoria, no los objetos en sí. Entonces no se está usando tu sobrecarga del operador <, sino que se está haciendo una simple comparación de números. Prueba desreferenciando:

return (*marca1) < (*marca2);
2 respuestas
E

#22 mmmm podéis tener razón.

Ahora no estoy en casa. Probaré en cuanto llegue. Muchas gracias!

E

Rafag y BLZKZ, quiero un hijo vuestro, 1 de cada uno #20 #22

Disteis en el clavo. Correcta la respuesta. Muchísimas gracias ;)

1

Usuarios habituales