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

C++ Discussion :

adresse d'un constructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut adresse d'un constructeur
    bonjour,


    j'aurai besoin de pouvoir stocker l'adresse d'un constructeur, je m'explique:

    j'ai une classe (ex: MaClasse) et une fonction qui prend en argument une l'adresse d'un objet qui dérive de MaClasse, et dans cette fonction, j'aurai besoin de parfois détruire/reconstruire cet objet. Or, si je passe à la fonction l'adresse de l'objet, je peux facilement le détruire, mais comment le reconstruire : car si je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     adresse_d_unobjet_dérivé_de_MaClasse = new MaClasse()
    ça l'fait pas

    J'avais donc pensé a passer a la fonction l'adresse du cnstructeur, sous cette forme : MaClasse()(*)() le problème, c'est que quand j'utilise la fonction, ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_fonction(DérivéDeMaClasse);
    j'ai cette erreur : '23 C:\Program Files\CASIO\ClassPad 300 SDK\Dev-Cpp\project\keyboardManager\main.cpp..... C5254 (E) Type name is not allowed '

    alors voila, si quelqu'un a une idée pour résoudre le problème (ou une meilleure idée)

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu ne peux pas prendre l'adresse d'un constructeur. Tu devrais plutôt jeter un oeil du côté du design pattern clone.

    http://c.developpez.com/faq/cpp/?pag...es#CLASS_clone

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Je pense que je ferais comme ça:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    // Une classe BIDON
    class BIDON{
     
      public:
     
        BIDON(){}
        ~BIDON(){}
     
      private:
     
        int m_iVal;
    };
     
    // Un pointeur de pointeur sur la classe BIDON
    // En gros l'adresse d'un pointeur sur ta future classe
    BIDON** pBidon;
     
    // prototype de ta fonction
    void Ma_Fonction_Bidon(BIDON**);
     
    // Tu passes pBidon en argument à ta fonction, exemple d'appel
    Ma_Fonction_Bidon(pBidon);
     
    // La fonction
    void Ma_Fonction_Bidon(BIDON** pBidon){
     
      (*pBidon) = new BIDON;
     
      // T'as plus besoin de bidon
      delete (*pBidon);
     
      // T'as encore besoin de bidon
      (*pBidon) = new BIDON;
     
      // etc...
    }
    LOL...

    Un truc tordu que j'ai jamais pû compiler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BIDON* pBidon;
     
    void Ma_Fonction_Bidon((BIDON*)&);
     
    Ma_Fonction_Bidon(pBidon);

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    je viens d'essayer le apttern clone, le prncipe semble être ce que je veux mais j'ai un pb a la compilation, a la ligne 'return new Derivé1(*this);' , j'ai l'erreur 'expression too complex' :s

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    T'as repris exactement le code de la FAQ ? Si non, on peut voir le code correspondant ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    bien sur:

    fichier keyboard.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
    #ifndef KEYBOARD__H
    #define KEYBOARD__H
     
    #include "classpad.h"
    #include "CPKeyboardManager.h"
     
    class keyboard : public CPKeyboardManager{
      private:
        int id;
        CPString name;
      public:
        keyboard(const PegRect&, CPString, int);
        keyboard(const CPKeyboardManager&, CPString, int);
        int getID();
        const CPString& getName();
        virtual keyboard* clone();
    };
     
    #endif
    et fichier keyboard.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
    #include "keyboard.h"
     
     
    keyboard::keyboard(const PegRect &rect, CPString s, int n):CPKeyboardManager(rect){
      id=n;
      name=s;
    }
     
    keyboard::keyboard(const CPKeyboardManager& k, CPString s, int n):CPKeyboardManager(k){
      id=n;
      name=s;
    }
     
    int keyboard::getID(){
      return id;
    }
     
    const CPString& keyboard::getName(){
      return name;
    }
     
    keyboard* keyboard::clone(){
      return new keyboard(*this);   //ligne ou il y a l'erreur 'expression too complex'
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    bon, en fait l'erreur vient du compilateur, il va falloir que je demande de l'aide chez Casio

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    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
    template <typename interface>
    struct Ibuilder {
        virtual interface * build() const = 0;
    };
     
    template <typename interface, typename concrete>
    struct builder : Ibuilder<interface> {
        virtual concrete * build() const { return new concrete; }
        // retour covariant
    };
     
     
    ...
    struct toto{ virtual ~toto(){} };
    struct titi: toto {};
    void f(Ibuilder<toto> const& b) {
        // Passage par valeur interdit.
        toto * t = b.build();
    }
    ...
    f(builder<toto,titi>());
    On peut aussi mettre un état dans l'objet de construction. Etat donné à la création du builder et utilisé dans build().
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    le compilateur supporte pas les templates

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Ca ne change rien au principe. C'est juste une facilité.
    Et si tu veux construire un nouveau truc du même type dynamique que l'objet courant, tu pars sur le même principe que clone, mais tu passes autre chose que *this en paramètre.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Adresse d'un constructeur
    Par deubelte dans le forum Débuter
    Réponses: 1
    Dernier message: 02/04/2010, 12h38
  2. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  3. changer l'adresse d'un fichier...
    Par cava dans le forum C
    Réponses: 6
    Dernier message: 05/06/2002, 12h22
  4. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29

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