IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

heritage en chaine


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    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 : 335
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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 1 568
    Points : 7 658
    Points
    7 658
    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 : 30
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 1 568
    Points : 7 658
    Points
    7 658
    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 : 30
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    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, 04h31
  2. probleme d'heritage sur des chaines de caracteres
    Par pikiwiki dans le forum C++
    Réponses: 3
    Dernier message: 24/05/2006, 21h01
  3. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  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, 10h08
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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