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

Discussion: heritage en chaine

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2015
    Messages : 80
    Points : 63
    Points
    63

    Par défaut heritage en chaine

    bonjour,

    je cherche a réaliser un heritage en c++ suivant le modèle suivant Nom : Capture.PNG
Affichages : 71
Taille : 70,3 Ko

    j'ai donc créé mes classes comme ceci
    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
    class Rule {
     
    public:
     
    	/*DESTRUCTOR*/
    	virtual ~Rule();
     
    	/*METHODES*/
    	virtual ERuleStatement evaluate(list<float> listValues, float mean, float SD) = 0;
     
    	/*SETTER*/
    	virtual void setIsActive(bool isActive);
    	virtual void setName(ERulesName name);
     
     
    	/*GETTER*/
    	virtual bool getIsActive();
    	virtual ERulesName getName();
     
     
     
    protected:
    	/*ATTRIBUTS*/
    	bool isActive;
    	ERulesName name;
    };
    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
    class Parameterizable_Rules : public Rule{
     
    protected:
    	/*ATTRIBUTS*/
    	int value;
     
    public:
    	/*DESTRUCTOR*/
    	virtual ~Parameterizable_Rules();
     
    	/*METHODES*/
    	virtual ERuleStatement evaluate(list<float> listValues, float mean, float SD) = 0;
     
    	/*GETTER*/
    	int getValue();
     
    	/*SETTER*/
    	void setValue(int value);
    };
    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
    class Rule_X_1s : public Parameterizable_Rules {
     
    private:
    	/*ATTRIBUTS*/
    	static Rule_X_1s *instance;
     
    protected:
    	/*CONSTRUCTOR*/
    	Rule_X_1s();
     
    public:
    	/*DESTRUCTOR*/
    	virtual ~Rule_X_1s();
     
    	/*METHODES*/
    	virtual ERuleStatement evaluate(list<float> listValues, float mean, float SD);
     
    	/*GETTER*/
    	static Rule_X_1s *getInstance();
    };
    tous fonctionne correctement hormis une chose dans mon programme j'ai un liste de Rule
    crée comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void EvaluateController::createRules(){
        Rule* rulesList[8];
        rulesList[0] = Rule_1_2s::getInstance();
        rulesList[1] = Rule_1_3s::getInstance();
        rulesList[2] = Rule_2_2s::getInstance();
        rulesList[3] = Rule_2of3_2s::getInstance();
        rulesList[4] = Rule_R_4s::getInstance();
        rulesList[5] = Rule_X_1s::getInstance();
        rulesList[6] = Rule_Xx::getInstance();
        rulesList[7] = Rule_XT::getInstance();
    }
    seul les 3 dernières rules ont une valeur j'aimerais donc faire un listerules[5].getValue() mais mon IDE refuse et me souligne le tout en rouge
    je pense qu'il faudrait que je le cast ou alors que mes méthodes get et setValue soit en virtual mais si je fais ca je dois les redefinir dans toute les autre classes, j'aimerais pouvoir la redéfinir uniquement dans la classe qui m’intéresse une idée ? merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 246
    Points
    4 246

    Par défaut

    Bonjour,

    Ça n'aurait aucun sens d'ajouter getValue() à la classe Rule.
    Si le système est correctement posé, au moment où la fonction doit être appelée, on doit savoir que l'objet est un Parameterizable_Rules. Sinon il y a le dynamic_cast<Parameterizable_Rules*>(aRulePtr) mais il ne devrait normalement pas être utilisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Rule*  rulesList[8];
        ......
        rulesList[4] = Rule_R_4s::getInstance();
        Parameterizable_Rules* par_rule = Rule_X_1s::getInstance();
        par_rule->setValue( 1 );
        rulesList[5] = par_rule;
        par_rule = Rule_Xx::getInstance();
        par_rule->setValue( 1 );
        rulesList[6] = par_rule;
        ......

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2015
    Messages : 80
    Points : 63
    Points
    63

    Par défaut

    merci beaucoup ça marche très bien cela dit je trouve très étrange la fait de ne pas pouvoir faire comme en java et déclarer une méthode dans une interface et l’implémenter uniquement ou elle est utile

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 246
    Points
    4 246

    Par défaut

    On peut en C++ faire comme en Java, créer un type local avec une interface et définir des fonctions locales. Mais le C++ a beaucoup plus de possibilités et cette méthode est découragée. On considère en C++ que les résolutions dynamiques de type sont un danger. La méta-programmation permet une résolution statique qui est plus sécuritaire.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2015
    Messages : 80
    Points : 63
    Points
    63

    Par défaut

    encore merci pour ces précisions dalfab

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 979
    Points : 11 080
    Points
    11 080
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par quinroux Voir le message
    merci beaucoup ça marche très bien cela dit je trouve très étrange la fait de ne pas pouvoir faire comme en java et déclarer une méthode dans une interface et l’implémenter uniquement ou elle est utile
    Mais ce n'est pas possible ? Ou alors tu obtiens une classe abstraite si tu n'implémentes pas toute l'interface.

    Code java : 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
     
     
    public class Main {
     
        public interface Foo {
            public void bar();
            public void zorg();
        }
     
        public class FooImpl implements Foo {
            public void bar() {
                System.out.println("FooImpl::bar()");
            }
        }
     
        public static void main(String[] args) {
            System.out.println("hello, world");
        }
    }

    $javac Main.java
    Main.java:10: error: Main.FooImpl is not abstract and does not override abstract method zorg() in Foo
        public class FooImpl implements Foo {
               ^
    1 error
    Ou alors tu parles d'anonymous inner class ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Heritage en chaine
    Par DakM dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2013, 05h31
  2. probleme d'heritage sur des chaines de caracteres
    Par pikiwiki dans le forum C++
    Réponses: 3
    Dernier message: 24/05/2006, 22h01
  3. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 21h25
  4. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 11h08
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 20h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo