Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

problème polymorphisme (je crois) et héritage


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    problème polymorphisme (je crois) et héritage
    Bonjour, je suis en train de développer un genre de sim city simplifié.

    classes: energy->building, RCI->building

    Pour stocker les batiments, j'ai créé un vector de vector qui contiennent des références de buildings pour que puisse mettre la classe energy ou RCI dans le meme tableau.
    Je peux utiliser les fonctions de building mais pas les fonctions de Energy quand j'insere un Energy dans le vector... Comment puis-je faire pour que l'objet de la classe energy soit considérée comme un energy?

    Merci d'avance pour vos réponses !

    Main.cpp
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    std::vector<building*> batiments[17];
     
     
    void listBatiments();
     
     
    int main()
    {
     
        listBatiments();
        return 0;
    }
     
    void listBatiments(){
        batiments[0].push_back(new Energy(Energy::power));
     
     
        batiments[0][0]->setAllProperties(6000, 150, 3,3, "Coal power plant", 17);
        batiments[0][0]->setState(building::isHud);
        /**
        batiments[0][0]->setEnergyDelivered(1000);
        
        ça ne marche pas
        error: 'class building' has no member named 'setEnergyDelivered'|
        **/
    }


    energy.h
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #ifndef ENERGY_H
    #define ENERGY_H
     
    #include <building.h>
     
     
    class Energy : public building
    {
        public:
            enum energyType{water,power,garbage};
     
     
            Energy(energyType energy);
            ~Energy();
     
     
            void setEnergyDelivered(int energyDelivered);
            int getEnergyDelivered();
     
     
        private:
            energyType m_energyType;
            int m_energyDelivered;
    };
     
     
    #endif // ENERGY_H

  2. #2
    Expert éminent
    Il faut tester , mais
    1. soit les fonctions doivent être virtuelles dans la classe Building (<- avec 1 B majuscule parce que tes conventions de codage/ ton code sont très "à la one again bistoufly" )
    2. soit tu castes Energy* elt = (Energy*) batiments[0][0]; elt->setEnergyDelivered(1000);

  3. #3
    Futur Membre du Club
    Citation Envoyé par foetus Voir le message
    Il faut tester , mais
    1. soit les fonctions doivent être virtuelles dans la classe Building (<- avec 1 B majuscule parce que tes conventions de codage/ ton code sont très "à la one again bistoufly" )
    2. soit tu castes Energy* elt = (Energy*) batiments[0][0]; elt->setEnergyDelivered(1000);
    Merci pour ta réponse, pour le B ça a été changé.

    comme je n'ai pas les mêmes fonctions dans Building et Energy, les méthodes virtuelles ne servent à rien et ne changent rien. ça m'embète un peu de devoir à chaque fois déclarer une variable mais si c'est la seule solution je vais devoir faire avec.

  4. #4
    Expert éminent
    Citation Envoyé par blue dragon Voir le message
    je n'ai pas les mêmes fonctions dans Building et Energy, les méthodes virtuelles ne servent à rien et ne changent rien
    Tu en es sûr ? Si tu déplaces ta méthode setEnergyDelivered dans la classe Building en la mettant virtuelle, je pense que tu n'as pas besoin de caster et que juste batiments[0][0]-> fonctionne.

    Après effectivement, la conception c'est n'importe quoi tu ne peux pas garnir ta classe mère avec les fonctions des classes filles il y a sûrement 1 autre façon de concevoir le code.


    Édit : Lorsque je dis déplacer , c'est la déclarer dans la classe Building en virtuelle pour être ensuite surchargée dans la classe Energy (<- avec la même implémentation).
    Mais effectivement, c'est l'implémentation dans la classe Building qui pose question

  5. #5
    Futur Membre du Club
    Citation Envoyé par foetus Voir le message
    Tu en es sûr ? Si tu déplaces ta méthode setEnergyDelivered dans la classe Building en la mettant virtuelle, je pense que tu n'as pas besoin de caster et que juste batiments[0][0]-> fonctionne.

    Après effectivement, la conception c'est n'importe quoi tu ne peux pas garnir ta classe mère avec les fonctions des classes filles il y a sûrement 1 autre façon de concevoir le code.
    ça peut marcher mais que si je met la méthode dans Buildings ce qui n'est pas pratique au vu du nombre de classes que j'aimerais faire.

  6. #6
    Membre expert
    L'utilisation de l'héritage n'est peut-être tout simplement pas la bonne manière de faire. Pourquoi ne pas faire un std::vector par type ?

  7. #7
    Futur Membre du Club
    Citation Envoyé par jo_link_noir Voir le message
    L'utilisation de l'héritage n'est peut-être tout simplement pas la bonne manière de faire. Pourquoi ne pas faire un std::vector par type ?
    Tout simplement parce que je compte mettre une trentaine de batiments différents et je ne vais pas faire 30 for pour chaque action à faire mais plutot 1 for dans 1 for pour tout

  8. #8
    Membre expert
    Il y a des moyens simples pour ne pas écrire les 30 for avec plusieurs vector: std::tuple + std::apply.

###raw>template_hook.ano_emploi###