Problème de classe abstraite - C++

Fermé
Tohan - Modifié par Tohan le 2/05/2015 à 06:00
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 2 mai 2015 à 11:44
Salut,
J'ai un code c++ comprenant, entre autres, une classe Entite héritant d'une classe Entite_Pure comprenant les méthodes pures afin que la classe Entite ne soit pas abstraite.
Pourtant, lorsque je veux déclarer un objet Entite dans ma classe Collision, il semblerait que ma classe Entite soit abstraites.

Classe Entite_Pure:
#ifndef ENTITE_PURE_H
#define ENTITE_PURE_H

#include <iostream>
#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

class Entite_Pure
{
    public:
        Entite_Pure();
        virtual void setPosition(Vector2f p)=0;
        virtual Vector2f getTaille()=0;
        virtual void setTop(bool up)=0;
        virtual void setBottom(bool bottom)=0;
        virtual void setLeft(bool left)=0;
        virtual void setRight(bool right)=0;
    protected:
};

#endif // ENTITE_PURE_H



Classe Entite :

#ifndef ENTITE_H
#define ENTITE_H

#include "Entite_Pure.h"

using namespace std;
using namespace sf;

class Entite : public Entite_Pure
{
    public:
        Entite();
        Vector2f getPosition();
    protected:
        Vector2f position;
        Vector2f taille;
};

#endif // ENTITE_H


Classe Collision :
#ifndef COLLISION_H
#define COLLISION_H

#include <list>
#include "Block.h"
#include "Perso.h"
#include "Fonctions.h"

using namespace std;
using namespace sf;

class Collision
{
    public:
        Collision();
        bool PointIntoSquare(Vector2f p, Entite b);
        bool SquareIntoSquare(Entite b1, Entite b2);
        bool contactSquares(Entite b1, Entite b2);
        void trouverCote(Entite *b1, Entite *b2);
        void trouverLesCotes(Entite *b1, Entite *b2);
        void updateContact();
        void addEntite(Entite *e);
    private:
        list<Entite*> Lentite;
};

#endif // COLLISION_H


Message d'erreur :
16|error: cannot declare parameter 'b' to be of abstract type 'Entite'|


PS : J'ai une multitude d'autres erreurs, mais c'est celle-ci qui me pose problème.


Merci pour votre aide.

1 réponse

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 2/05/2015 à 11:44
'lut, en prenant un
Entite
tout court, C++ a un comportement défini: copier l'objet pour l'utiliser dans ta fonction.
Le hic, c'est que ton objet abstrait
Entite_Pure
ne peut pas être utilisé pour être copié (constructeur de copie inexistant, devrait être virtuel... joyeux bazar).
Donc, il suffit d'empêcher la copie, et pour ça, on se sert de références (pointeurs masqués si tu veux):
class Collision
{
    public:
        Collision();
        bool PointIntoSquare(const Vector2f &p, const Entite &b) const;
        bool SquareIntoSquare(const Entite &b1, const Entite &b2) const;
        void trouverCote(Entite &b1, Entite &b2);
        void trouverLesCotes(Entite &b1, Entite &b2);
        void updateContact();
        void addEntite(Entite *e);
    private:
        list<Entite*> Lentite;
};
Et dans ton code:
bool Collision::PointIntoSquare(const Vector2f &p, const Entite &b) const {
   ...
}
Tu te sers de
b
(et
p
) comme tu l'aurais fait sans référence. J'ai rajouté des
const
et passé le vecteur en référence: essaie de tout passer en
const
et référence dans les cas où tu ne fais que lire un objet, pas le modifier; ça évite les copies d'objet inutiles. Pareil pour le
const
des méthodes, pour quand tu modifies pas l'objet auquel elle appartiennent.
from human import idiocy
del idiocy
0