Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cNoob en 7 Enero 2018, 19:24 pm



Título: Crear puntero a clase abstracta y problema usando vector
Publicado por: cNoob en 7 Enero 2018, 19:24 pm
Hola!
Estoy haciendo un programa que consiste en una biblioteca que puede almacenar una serie de items, que son guardados en un vector (ficha). La clase CFicha es abstracta y es la clase base para todas las demás (libros, revistas, etc...). Aquí les dejo la clase CBiblioteca:
Código
  1. class CBiblioteca
  2. {
  3.    vector<CFicha *> ficha;
  4.  
  5.    public:
  6.        //basico
  7.        CBiblioteca();
  8.        CBiblioteca(const CBiblioteca&);
  9.        ~CBiblioteca();
  10.        CBiblioteca operator=(const CBiblioteca&);
  11.        CFicha* operator[](unsigned);
  12.  
  13.        //funciones
  14.        void AnyadirFicha(CFicha&);
  15.        int BuscarFicha(const string) const;
  16.        //eliminar siguiente ?
  17.        bool EliminarFicha(unsigned);
  18.        bool MostrarFicha(unsigned);
  19.        bool MostrarBiblioteca(void);
  20. };
Mi problema se da en el método 'operator=' y 'AnyadirFicha()', los cuales son definidos así:
Código
  1. CBiblioteca CBiblioteca::operator=(const CBiblioteca& bib)
  2. {
  3.    //primero vaciamos la matriz
  4.    for(int i = 0; i < ficha.size(); i++)
  5.        delete ficha[i];
  6.  
  7.    ficha.clear();
  8.  
  9.    //ahora copiamos los elementos
  10.    for(int i = 0; i < bib.ficha.size(); i++)
  11.        ficha.push_back(new CFicha(*(bib.ficha[i])));
  12.  
  13.    return *this;
  14. }
y
Código
  1. void CBiblioteca::AnyadirFicha(CFicha& ficha)
  2. {
  3.    ficha.push_back(new CFicha(ficha));
  4. }
ambas me dan los mismos dos errores:
 'class CFicha' has no member named 'push_back'
 invalid new-expression of abstract class type 'CFicha'

pero no entiendo por que interpreta que push_back es un método de CFicha y no de la clase vector, así como mi otra duda de si se puede crear un objeto abstracto con el operador new.


Título: Re: Crear puntero a clase abstracta y problema usando vector
Publicado por: ivancea96 en 7 Enero 2018, 20:17 pm
Código
  1. void CBiblioteca::AnyadirFicha(CFicha& ficha)
  2. {
  3.    ficha.push_back(new CFicha(ficha));
  4. }

Fíjate que llamaste al parámetro igual que al miembro vector. Así que cuando escribes ficha, interpreta que es el parámetro. Tendrías que poner "this->ficha" para acceder, o mejor, cambiar los nombres. Por este motivo entre otros, a los campos privados de una clase, se les suele poner un '_' al inicio ("_ficha"). Sefún nomenclatura.
En cualquier caso, cambia algún nombre.

Luego, no, no puedes crear una clase abstracta. la razón de las clases abstractas es ser heredadas y que se implementen sus métodos. No tiene lógica crear un objeto de una clase abstracta, porque tendrá métodos sin definir.


Título: Re: Crear puntero a clase abstracta y problema usando vector
Publicado por: cNoob en 7 Enero 2018, 20:42 pm
Awww dios, que error más tonto el primero  :-X
Respecto al segundo, mi intención es crear un puntero de una clase base para almacenar en el un objeto de una clase derivada de esta. En algún libro de POO he visto que hacen eso y me suena que era algo por el estilo de lo que estoy haciendo yo .-.


Título: Re: Crear puntero a clase abstracta y problema usando vector
Publicado por: ivancea96 en 7 Enero 2018, 20:44 pm
Sin duda puedes tener punteros a clases abstractas, nada de eso es incorrecto. lo que no puedes es crear un objeto de una clase abstracta. Tienes que crear un objeto de una de sus clases derivadas.


Título: Re: Crear puntero a clase abstracta y problema usando vector
Publicado por: cNoob en 8 Enero 2018, 16:13 pm
y al hacer
Código
  1. ficha[i] = new CFicha
no estoy usando punteros solamente?


Título: Re: Crear puntero a clase abstracta y problema usando vector
Publicado por: ivancea96 en 8 Enero 2018, 19:57 pm
Pero no puedes instanciar una clase abstracta, sea puntero o no. Una clase abstracta no se puede instanciar por sí sola, tiene que heredarse de ella.


Título: Re: Crear puntero a clase abstracta y problema usando vector
Publicado por: ThunderCls en 9 Enero 2018, 20:39 pm
Como te dicen anteriormente es un error de concepto querer instanciar una clase abstracta. Te recomiendo profundizar en temas de polimorfismo y clases abstractas.

Correcto:
TAbstract *abs = new TDerived();
abs->método(); // polimorfismo

Incorrecto:
TAbstract *abs = new TAbstract();