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 :

Héritage et constructeurs


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Points : 40
    Points
    40
    Par défaut Héritage et constructeurs
    salut,
    D'après mes connaissances, quand on défini une classe dérivée, son constructeur appelle automatiquement celui de la classe de base. Ce que j'ai fait c'est de définir une classe qui hérite d'une autre, mais quand je l'appelle avec les paramètres du constructeurs de la classe de base le compilateur l'accepte pas et voici l'erreur qu'il me renvoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    client1.cpp:35: erreur: no matching function for call to ‘Client_TCP2::Client_TCP2(const char [10], int, bool, bool)’
    client1.cpp:28: note: candidats sont: Client_TCP2::Client_TCP2()
    client1.cpp:28: note:                 Client_TCP2::Client_TCP2(const Client_TCP2&)
    make: *** [client1.o] Erreur 1

    Mon code est le suivant:

    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
     
    #include <iostream>
    #include "cogitant/cogitant.h"
    #include "cogitant/cs/ccxx.h"
    #include "cogitant/cs/client.h"
     
    using namespace std;
    using namespace cogitant;
    using namespace cogitantcs;
     
    class Client_TCP2: public Client_TCP
    {
     
    };
     
    int main(int , char* [])
    {
    try{
        Client_TCP2 client("127.0.0.1", 4246,true,true);   
       }
     
    catch (cogitant::Exception const & e)
        {
            cerr << e;
            return 1;
        }
        return 0;
    }
    Et la classe de base est définie ici:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    // ==============
    //   CoGITaNT 5 
    // ==============
     
    /** \file cs/ccxx.h
     *      Opérations d'entrées sorties utilisant la bibliothèque Common C++ (v1 ou v2).
     *      Déclaration des classes cogitantcs::OperationCSIO_TCP, cogitantcs:OperationCSIO_HTTP, cogitantcs::Server_TCP, cogitantcs::Client_TCP et cogitantcs::Client_HTTP.
     *      \author David Genest.
     */
     
    #ifndef CogitantCS_Ccxx_h
    #define CogitantCS_Ccxx_h
     
    #include <cc++/socket.h>
    #include <cc++/url.h>
    #include "cogitant/cs/server.h"
    #include "cogitant/cs/client.h"
     
    namespace cogitantcs {
     
    /** \class OperationCSIO_TCP cs/ccxx.h "cogitant/cs/ccxx.h"
     *      Opération simple de lecture et d'écriture sur une socket.
     *      Cette opération n'accepte pas plusieurs connextions simultanées
     *      \warning Requiert l'utilisation de la bibliothèque CommonC++. */
    class CGTDLLEXPORT_CS_CCXX OperationCSIO_TCP: public OperationCSIO
    {
    private:
    		/** Nom d'hote du serveur.
                     *      (utilisé uniquement pour le client) */
    		std::string m_server;
    		/** Port (en TCP). */
    		ost::tpport_t m_port;
    		/** Socket de communication. */
    		ost::TCPStream * m_tcpstream;
     
    public:
    		/** Constructeur pour utilisation en serveur.
                     *      \param port Numéro de port d'attente de connexions. */
    		OperationCSIO_TCP(ost::tpport_t port = 4246);
    		/** Constructeur pour utilisation en client.
                     *      \param host Nom d'hote du serveur.
                     *      \param port Numéro du port du serveur. */
    		OperationCSIO_TCP(std::string const & host, ost::tpport_t port=4246);
     
    		/** Destructeur. */
    		~OperationCSIO_TCP();
     
    		/** Ouverture d'une connexion client.
                     *      La connexion est demandée vers le serveur / port précisés au constructeur. */
    		void open();
    		/** Fermeture d'une connexion client.
                     *      La liaison TCP est coupée. */
    		void close();
     
    		/** Démarrage de l'écoute (mode serveur). */
    		void listen();
    		/** Arrêt de l'écoute (mode serveur). */
    		void stop();
     
    		void receive(cogitant::XmlDocument & doc, iSession & ids);
    		void send(cogitant::XmlDocument const & doc, iSession ids=0);
    		void send(std::list<std::string> const & txt, iSession ids=0);
    };
     
    /** \class OperationCSIO_HTTP cs/ccxx.h "cogitant/cs/ccxx.h"
     *      Opération simple de lecture et d'écriture en utilisant le protocole HTTP (POST).
     *      \warning Seules les fonctions de client sont implantées dans cette classe, et il est interdit d'utiliser cette classe dans un serveur, car les méthodes listen() et stop() ne peuvent être utilisées (pour l'instant). */
    class CGTDLLEXPORT_CS_CCXX OperationCSIO_HTTP: public OperationCSIO
    {
    private:
    		/** URL. */
    		std::string m_url;
    		/** Socket de communication. */
    		ost::URLStream m_stream;
     
    public:
    		/** Constructeur pour utilisation en client.
                     *      \param url URL du serveur à contacter. */
    		OperationCSIO_HTTP(std::string const & url);
    		/** Destructeur. */
    		~OperationCSIO_HTTP();
     
    		/** Démarrage de l'écoute (mode serveur).
                     *      \warning Méthode non implantée ! */
    		void listen();
    		/** Arrêt de l'écoute (mode serveur).
                     *      \warning Méthode non implantée ! */
    		void stop();
     
    		void receive(cogitant::XmlDocument & doc, iSession & ids);
    		void send(cogitant::XmlDocument const & doc, iSession ids=0);
    		void send(std::list<std::string> const & txt, iSession ids=0);
    };
     
    /** \class Server_TCP cs/ccxx.h "cogitant/cs/ccxx.h"
     *      Serveur simple qui attend des connexions sur une socket et lit requêtes sur cette socket avant de retourner la réponse par le même moyen.
     *      \sa cogitantcs::OperationCSIO_TCP. */
    class CGTDLLEXPORT_CS_CCXX Server_TCP: public Server
    {
    public:
    		/** Constructeur.
                     *      \param port Numéro de port d'attente de connexions. */
    		Server_TCP(unsigned int port = 4246);
    };
     
    /** \class Client_TCP cs/ccxx.h "cogitant/cs/ccxx.h"
     *      Implantation du client en utilisant le protocole TCP.
     *      Dans ce mode, le client reste connecté en permanence au serveur par TCP. 
     *      \sa cogitantcs::OperationCSIO_TCP. */
    class CGTDLLEXPORT_CS_CCXX Client_TCP: public Client
    {
    public:
    		/** Constructeur.
                     *      \param host nom d'hote du serveur.
                     *      \param port numéro du port du serveur.
                     *      \param localsupport si \c true le support est local au client, et le serveur n'est jamais interrogé pour obtenir le support. Si \c false il ne faut pas charger un support dans l'environnement associé au client, car le support de l'environnement est celui du serveur.
                     *      \param localobjects si \c true les objets de l'environnement sont locaux, et le serveur n'est jamais interrogé pour obtenir les objets. */
    		Client_TCP(std::string const & host, unsigned int port=4246, bool localsupport=false, bool localobjects=false);
    };
     
     
    /** \class Client_HTTP cs/ccxx.h "cogitant/cs/ccxx.h"
     *      Implantation du client en utilisant le protocole HTTP (POST).
     *      Dans ce mode, le client établit une connexion avec un serveur HTTP à chaque exécution de requête devant être transmise au serveur. Il faut donc que le serveur HTTP contacté rende accessible le serveur CoGITaNT par le biais d'un CGI.
     *      \sa cogitantcs::OperationCSIO_HTTP. */
    class CGTDLLEXPORT_CS_CCXX Client_HTTP: public Client
    {
    public:
    		/** Constructeur.
                     *      \param url URL à laquelle le serveur est accessible.
                     *      \param localsupport si \c true le support est local au client, et le serveur n'est jamais interrogé pour obtenir le support. Si \c false il ne faut pas charger un support dans l'environnement associé au client, car le support de l'environnement est celui du serveur.
                     *      \param localobjects si \c true les objets de l'environnement sont locaux, et le serveur n'est jamais interrogé pour obtenir les objets. */
    		Client_HTTP(std::string const & url, bool localsupport=false, bool localobjects=false);
    };
     
    }
    #endif
    Merci à vous tous

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Deux points :

    * La classe Client_TCP2 ne définit pas de constructeurs prenant en paramètres une chaîne, un entier et deux booléens, ni aucun constructeur qui pourrait convenir avec les règles de promotions, il est tout à fait normal que le compilateur ne sache pas quel constructeur appelé. Il faut définir les constructeur nécessaire.
    * Si tu ne précises pas, le constructeur de Client_TCP2 appellera le constructeur par défaut de la classe de base, pas celui que tu souhaites visiblement appelé.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    ta classe Client_TCP2 hérite publiquement de Client_TCP.

    Lorsque tu va construire un objet de type Client_TCP2, le compilateur va chercher les constructeurs disponibles de Client_TCP.

    Ce dernier définie un constructeur qui n'a besoin que d'un seul paramètre pour être appelé (les autres ont une valeur par défaut, on peut spécifier la valeur mais ca marchera sans).

    Il faut donc que depuis ta classe Client_TCP2, tu passe une chaîne de caractères à ta classe mère.

    Quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Client_TCP2 : public Client_TCP
    {
    public:
    Client_TCP2(const std::string& s):Client_TCP2(s){}
    };
    Tu peux bien sur rajouter d'autres paramètres dans le constructeur si tu veux les passer à ta classe mère.

    PS/ grilled
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Points : 40
    Points
    40
    Par défaut
    merci de me répondre.

    Bon, effectivement quand je fais ce que vous m'avez dis cela marche parfaitement. Mais je veux savoir une chose; Si vous regardez le fichier ou elle est définie la classe Client_TCP vous allez voir qu'elle hérite de la classe Client. Là ça marche et pourtant je trouve aucun lien avec le constructeur de la classe client . Merci de m'eclaicir ce point.
    Voici le fichier ou elle est définie la classe client:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
     
    // ==============
    //   CoGITaNT 5 
    // ==============
     
    /** \file cs/client.h
     *      Fonctionnalités de client (accès à un serveur).
     *      Déclaration de la classe cogitantcs::Client.
     *      \author David Genest.
     */
     
    #ifndef CogitantCS_Client_h
    #define CogitantCS_Client_h
     
    #include "cogitant/common.h"
    #include "cogitant/cs/base.h"
    #include "cogitant/xmldocument.h"
    #include "cogitant/support.h"
    #include "cogitant/supportobject.h"
    #include "cogitant/graph.h"
    #include "cogitant/rule.h"
    #include "cogitant/environment.h"
    #include "cogitant/partialorder.h"
    #include "cogitant/allocator.h"
    #include "cogitant/propertyset.h"
     
    namespace cogitantcs {
     
    class EnvironmentAllocatorClient;
    template <class SetContent> class SetClient;
     
    /// Diverses vérifications sur les fonctionnalités de client.
    #define CGA_CLIENT_MISC 1
     
    /** \class Client cs/client.h "cogitant/cs/client.h"
     *      %Client.
     *      Un client est connecté à un serveur et permet d'interroger ce dernier pour fournir un accès aux environnements présents sur le serveur comme s'il s'agissait d'environnements locaux au client.
     *      Un client ouvre la connexion vers le serveur dès le constructeur (OperationCSIO::open()) et ferme la connexion dans le destructeur. Donc les méthodes open() et close() ne doivent être utilisées que dans le cas ou on désire explicitement couper la communication avec le serveur pour la réouvrir plus tard.
     *      \see \ref prog_cs.
     */
    class CGTDLLEXPORT_CS Client: public Base
    {
    private:
    	/// Environnement géré par le client.
    	cogitant::Environment* m_environment;
    	/// Identificateur de l'environnement dans le serveur.
    	cogitant::iSet m_idenv;
    	/// Stockage des requêtes en attente.
    	cogitant::XmlDocument m_pendingqueries;
    	/// Stockage de la dernière réponse reçue du serveur.
    	cogitant::XmlDocument m_answer;
    	/// Informations sur le serveur.
    	cogitant::PropertySet m_serverinfo;
    	/// Stockage du dernier résultat de la requête de comparaison.
    	cogitant::PartialOrder::Comparison m_comparisonresult;
    	///     Les environnements créés dans ce client ont un support local.
    	bool m_localsupport;
    	///     Les environnements créés dans ce client ont des graphes locaux.
    	bool m_localobjects;
     
    public:
    /** @name Constructeurs - destructeur. */
    //@{
    	/** Constructeur par défaut.
             *      \param opeio opérations d'entrées/sorties utilisées par le client pour communiquer avec le serveur.
             *      \param localsupport si \c true le support est local au client, et le serveur n'est jamais interrogé pour obtenir le support. Si \c false il ne faut pas charger un support dans l'environnement associé au client, car le support de l'environnement est celui du serveur.
             *      \param localobjects si \c true les objets de l'environnement sont locaux, et le serveur n'est jamais interrogé pour obtenir les objets. */
    	Client(OperationCSIO * opeio, bool localsupport, bool localobjects);
    	/** Destructeur.
             *      \warning La destruction du client ne provoque pas la destruction de l'environnement (de cette façon, il est possible de couper la connexion avec le server et de conserver l'environnement obtenu, dans ce cas, il est toutefois impossible d'obtenir de nouvelles informations du serveur). */
    	virtual	~Client();
    //@}
     
    protected:
    	/** Efface l'ensemble des requêtes en attente. */
    	void clearPendingQueries();
    	/** Retourne l'identificateur d'ensemble correspondant à l'ordre partiel passé. */
    	cogitant::iSet partialOrderToISet(cogitant::PartialOrder const * po);
     
    	/** Prise en compte de la réponse reçue du serveur.
             *      Le noeud \e node de la réponse \e m_answer est interprété et l'action correspondante est exécutée, à condition que ce noeud correponde à une opération standard. Il est donc possible de redéfir cette méthode dans les sous-classes pour gérer des réponses particulières ou effectuer des traitements spéciaux sur les réponses standard. */
    	virtual	void execAnswer(cogitant::XmlDocument::Element const * node);
    	/** Prise en compte d'une réponse environment. */
    	virtual void execAnswerEnvironment(cogitant::XmlDocument::Element const * node);
    	/** Prise en compte d'une réponse setcontent. */
    	virtual void execAnswerSetContent(cogitant::XmlDocument::Element const * node);
    	/** Prise en compte d'une réponse graph. */
    	virtual void execAnswerGraph(cogitant::XmlDocument::Element const * node);
    	/** Prise en compte d'une réponse rule. */
    	virtual void execAnswerRule(cogitant::XmlDocument::Element const * node);
    	/** Prise en compte des réponses immediateless, immediategreater et comparison. */
    	virtual void execAnswerPartialOrder(cogitant::XmlDocument::Element const * node);
    	/** Prise en compte d'une réponse bannedtypes. */
    	virtual void execAnswerBannedTypes(cogitant::XmlDocument::Element const * node);
     
    	/** Envoi d'une requête au serveur. */
    	virtual	void sendQuery(cogitant::XmlDocument const & query);
    	/** Lecture d'une réponse envoyée par le serveur. */
    	virtual	void readAnswer(cogitant::XmlDocument & answer);
    	/** Ouverture de la communication avec le serveur. */
    	virtual	void open();
    	/**     Création d'un allocateur pour un environnement. */
    	virtual	EnvironmentAllocatorClient * newEnvironmentAllocator();
     
    public:
    /** @name Modifications */
    //@{
    	/** Choix de l'environnement parmi ceux offerts par le serveur.
             *      Cette méthode (ou l'autre de même nom) doit être obligatoirement appelée avant tout accès au serveur.
             *      \param ie identificateur de l'environnement offert par le serveur.
             *      \exception cogitantcs::ExceptionClient si aucun environnement de cet identificateur n'est offert par le serveur. */
    	void setServerEnvironment(cogitant::iSet ie);
    	/** Choix de l'environnement parmi ceux offerts par le serveur.
             *      Cette méthode (ou l'autre de même nom) doit être obligatoirement appelée avant tout accès au serveur.
             *      \param en nom de l'environnement offert par le serveur.
             *      \exception cogitantcs::ExceptionClient s'il n'existe aucun environnement de ce nom.
             *      \sa OpeServerEnvironment. */
    	void setServerEnvironment(std::string const & en);
    	/** Fermeture de la connexion avec le serveur.
             *      \warning Cette méthode doit être utilisée avec précaution car après appel à cette méthode, le lien avec le serveur est interrompu, ce qui signifie que si le client a besoin de faire un accès au serveur pour transférer un objet ou le résultat d'une opération, un exception sera levée car la connexion ne sera plus active. Cette méthode ne doit donc être utilisée que dans le cas où il est certain que plus aucune requête ne sera adressée au serveur. Dans ce cas, le serveur peut être libéré de la gestion de cette connextion (dans le cas d'un lien en mode connecté tel que Client_TCP). */
    	virtual	void close();
    	/** Ajoute une requête à l'ensemble des requêtes en attente.
             *      \return le noeud (Element) ajouté à la requête en attente. */
    	cogitant::XmlDocument::Element * createPendingQuery(std::string const & name);
    	/** Ajoute une requête à l'ensemble des requêtes en attente.
             *      \param name nom de l'ordre.
             *      \param p1 nom du premier paramètre.
             *      \param v1 valeur du premier paramètre.
             *      \param p2 nom du deuxième paramètre.
             *      \param v2 valeur du second paramètre.
             *      \param p3 nom du troisième paramètre.
             *      \param v3 valeur du troisième paramètre. */
    	cogitant::XmlDocument::Element * createPendingQuery(std::string const & name, std::string const & p1, std::string const & v1, std::string const & p2="", std::string const & v2="", std::string const & p3="", std::string const & v3="");
     
    	/** Environnement géré. */
    	cogitant::Environment * environment();
    //@}
     
    /** @name Accesseurs */
    //@{
    	/** Environnement géré. */
    	cogitant::Environment const * environment() const;
    	/** Réponse reçue du serveur. */
    	cogitant::XmlDocument const & answer() const;
    	/** Informations sur le serveur. */
    	cogitant::PropertySet const & serverProperties() const;
    	/** Identificateur de l'environnement côté serveur. */
    	cogitant::iSet serverEnvironmentISet() const;
    	/** Nombre d'environnements gérés par le serveur. */
    	cogitant::nSet serverEnvironments() const;
    //@}
     
    /** @name Requêtes.
     *      Les requêtes peuvent être effectuées en mode bloquant ou différé. Toutes les requêtes ont un paramètre \a imm (\e true par défaut) qui détermine le caractère "bloquant" de la requête. Si la valeur \e true est passée, l'appel à la méthode ne se termine pas tant que la réponse n'a pas été reçue par le serveur et l'action correspondante effectuée (création d'un type de concept, d'un graphe, etc.). Au contraire, si la valeur \e false est passée, la requête est mémorisée et n'est envoyée au serveur que quand la méthode executePendingQueries() est appelée, cette méthode attend aussi la réception de la réponse du serveur et execute les opérations correspondantes. Il est évidemment préférable d'utiliser cette deuxième méthode d'accès quand le serveur est disponible à travers un réseau et qu'un grand nombre de requêtes doivent être transmises. Par contre, pour les méthodes qui ont une valeur de retour, cette valeur de retour n'a de sens que dans le cas où la requête est exécutée immédiatement. <p>
     *      Ces méthodes peuvent lever l'exception cogitantcs::ExceptionClient dans le cas d'un problème de communication avec le serveur. A noter que les versions "non bloquantes" des requêtes ne peuvent provoquer une telle exception car la requête est simplement stockée.<p>
     *      La valeur de retour de la plupart de ces méthodes est l'identifiant du noeud ajouté à la requête en cours de construction. Évidemment, cette valeur n'a aucun intérêt si la requête est bloquante (imm = true). Dans ce cas, la requête est aussitot transmise au serveur et la réponse est attendue. Par contre, si la requête est mémorisée, la valeur de retour peut servir à rajouter des attributs à l'élément correspondant à la requête.<p>
     *      Une requête ne peut être exécutée sur le serveur que dans le cas où il connait une opération (cogitantcs::OpeServer) qui est capable de traiter cette requête. Selon la configuration du serveur, il est donc possible que certaines des requêtes ne soient pas utilisables. */
    //@{
    	/** Requête d'interrogation d'un élément d'un ensemble (dans l'environnement courant).
             *      \param n type de requête (<tt>qconcepttype</tt>, etc.).
             *      \param i identificateur de l'élément devant être transféré ou ISET_NULL pour transférer tous les éléments.
             *      \param imm exécution immédiate.
             *      \return Elément XML codant la requête.
             *      \sa OpeServerSetContent. */
    	cogitant::XmlDocument::Element * getSetContent(std::string const & n, cogitant::iSet i, bool imm = true);
    	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::ConceptType*> const * s, cogitant::iSet i, bool imm = true);
    	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::RelationType*> const * s, cogitant::iSet i, bool imm = true);
    	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::NestingType*> const * s, cogitant::iSet i, bool imm = true);
    	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::Individual*> const * s, cogitant::iSet i, bool imm = true);
    	/** Interrogation de l'ensemble des éléments d'un ensemble du support.
             *      Demande le transfert vers le client du contenu complet d'un ensemble d'éléments du support. Cette méthode ne sert qu'à optimiser les échanges d'information : plutot que de demander un par un les objets du support, l'exécution de cette méthode les demande tous en une seule opération, ce qui est beaucoup plus rapide.
             *      \param s 0 : tous les ensembles, 1 : types de concepts, 2 : types de relations, 3 : types d'emboîtement, 4 : marqueurs individuels.
             *      \param imm exécution immédiate.
             *      \return Element XML codant la requête.
             *      \sa OpeServerSetContent, getEnvironmentObjects(). */
    	cogitant::XmlDocument::Element * getSupportObjects(int s=0, bool imm=true);
     
    	/** Transfert d'un objet de l'environnement du serveur vers le client.
             *      \param i identificateur de l'objet à transférer dans le serveur.
             *      \param dest identificateur de l'objet à la réception. La valeur ISET_NULL repère qu'à la réception, l'objet est stocké à la même position que dans le serveur.
             *      \param imm exécution immédiate.
             *      \return Element XML codant la requête.
             *      \sa OpeServerSetContent, getEnvironmentObjects(). */
    	cogitant::XmlDocument::Element * getEnvironmentObject(cogitant::iSet i, cogitant::iSet dest=cogitant::ISET_NULL, bool imm = true);
    	/** Interrogation de l'ensemble des objets de l'environnement.
             *      \param imm exécution immédiate.
             *      \return Element XML codant la requête.
             *      \sa OpeServerSetContent, getSupportObjects(). */
    	cogitant::XmlDocument::Element * getEnvironmentObjects(bool imm = true);
     
    	/** Requête d'interrogation des éléments immédiatement inférieurs.
             *      \param s ordre partiel interrogé.
             *      \param i identificateur de l'élément devant être interrogé ou ISET_NULL pour recevoir les éléments immédiatement plus petits de tous les éléments de l'ordre partiel.
             *      \param imm exécution immédiate.
             *      \return Element XML codant la requête.
             *      \sa OpeServerImmediateLG, getImmediateLess(). */
    	cogitant::XmlDocument::Element * getImmediateLess(cogitant::PartialOrder const * s, cogitant::iSet i, bool imm = true);
    	/** Requête d'interrogation des éléments immédiatement inférieurs.
             *      \see getImmediateLess(). */
    	cogitant::XmlDocument::Element * getImmediateGreater(cogitant::PartialOrder const * s, cogitant::iSet i, bool imm = true);
    	/** Requête d'interrogation de l'ordre existant entre deux éléments d'un ordre partie.
             *      \param s ordre partiel interrogé.
             *      \param i identificateur à comparer.
             *      \param j identificateur à comparer.
             *      \return résultat de la comparaison.
             *      \sa OpeServerComparison. */
    	cogitant::PartialOrder::Comparison getComparison(cogitant::PartialOrder const * s, cogitant::iSet i, cogitant::iSet j);
    	/** Requête d'interrogation des propriétés du serveur.
             *      Habituellement, il n'est pas nécessaire d'appeler explicitement cette méthode.
             *      \sa serverProperties(), serverEnvironments, OpeServerServer. */
    	void getServerInfo(bool imm=true);
    	/** Met à jour l'objet du serveur avec l'objet local.
             *      \param i identificateur local de l'objet.
             *      \param dest identificateur de l'objet pour le serveur (ISET_NULL pour transférer l'objet avec le même identificateur que dans le client).
             *      \param imm exécution immédiate.
             *      \sa OpeServerCommitEnvironmentObject. */
    	void commitEnvironmentObject(cogitant::iSet i, cogitant::iSet dest=cogitant::ISET_NULL, bool imm = true);
    	/** Création d'un nouvel environnement dans le serveur.
             *      \param optorderc Optimisation automatique de l'ordre sur les types de concepts (après un chargement à partir d'un fichier). Si true, l'ensemble des types de concepts (et l'ordre) ne peut être modifié après un chargement.
             *      \param optorderr Optimisation automatique de l'ordre sur les types de relations (après un chargement à partir d'un fichier). Si true, l'ensemble des types de relations (et l'ordre) ne peut être modifié après un chargement.
             *      \param optordern Optimisation automatique de l'ordre sur les types d'emboîtements (après un chargement à partir d'un fichier). Si true, l'ensemble des types d'emboîtements (et l'ordre) ne peut être modifié après un chargement.
             *      \param imm exécution immédiate.
             *      \return identificateur de l'environnement créé (dans le cas où \a imm = <tt>true</tt>).
             *      \sa OpeServerNewEnvironment. */
    	cogitant::iSet newEnvironment(bool optorderc=true, bool optorderr=true, bool optordern=true, bool imm=true);
    	/** Création d'un nouvel objet d'environnement dans le serveur.
             *      \param ot type d'objet à créer : graphe (par défaut) ou règle.
             *      \param imm exécution immédiate.
             *      \result identificateur de l'objet créé (dans le cas où \a imm = <tt>true</tt>).
             *      \warning Habituellement, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
             *      \sa OpeServerNewEnvironmentObject. */
    	cogitant::iSet newEnvironmentObject(cogitant::EnvironmentObject::Type ot = cogitant::EnvironmentObject::OT_GRAPH, bool imm=true);
    	/** Destruction d'un objet de l'environnement.
             *      \param i Identificateur de l'objet à détruire.
             *      \param imm Exécution immédiate.
             *      \result \c true si l'objet a été correctement détruit et \c false si l'objet n'a pu être détruit. Attention, la méthode retourne \c false si \a imm vaut \c false. En effet, si l'exécution n'est pas immédiate, la requête de destruction est stockée dans le document contenant les requêtes en attentes, mais elle n'est pas expédiée immédiatement au serveur. Il est donc impossible de connaître à ce moment le résultat que retournera le serveur.
             *      \sa OpeServerDeleteEnvironmentObject. */
    	bool deleteEnvironmentObject(cogitant::iSet i, bool imm=true);
    	/** Création d'un nouveau type ou marqueur.
             *      \param ot type d'objet à créer ('c' type de concept, 'r' relation, 'n' emboîtement, 'i' marqueur individuel).
             *      \param imm exécution immédiate.
             *      \return identificateur du nouvel objet (dans le cas où \a imm = <tt>true</tt>).
             *      \warning Habituellement, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
             *      \sa OpeServerNewSupportObject. */
    	cogitant::iSet newSupportObject(char ot, bool imm=true);
    	/** Mise à jour de l'objet du serveur avec l'objet local.
             *      \param ot type d'objet à mettre à jour ('c' type de concept, 'r' relation, 'n' emboîtement, 'i' marqueur individuel).
             *      \param i identificateur de l'objet à mettre à jour.
             *      \param imm exécution immédiate.
             *      \sa OpeServerCommitSupportObject. */
    	void commitSupportObject(char ot, cogitant::iSet i, bool imm=true);
    	/**     Mise à jour d'un ordre partiel du serveur avec celui du client.
             *      \param ot ordre partiel à mettre à jour ('c' type de concept, 'r' relation, 'n' emboîtement).
             *      \param i1 identificateur d'un type dans l'ordre partiel.
             *      \param i2 identificateur d'un type dans l'ordre partiel. L'appel à cette méthode modifie l'information <code>i1 > i2</code>. L'ordre qui est envoyé au serveur dépend de la valeur locale de <code>i1 > i2</code>.
             *      \param imm exécution immédiate.
             *      \sa OpeServerCommitImmediateLess. */
    	void commitImmediateLess(char ot, cogitant::iSet i1, cogitant::iSet i2, bool imm=true);
    	/** Chargement d'un support dans le serveur.
             *      \param sn nom du fichier support. Ce fichier est chargé par le serveur, il doit donc être accessible sur le poste qui execute le serveur.
             *      \param env identificateur de l'environnement (serveur) qui doit charger le support. Si ISET_NULL est passé (par défaut), c'est l'environnement sélectionné par le client (par setServerEnvironment()) qui charge le support.
             *      \param imm exécution immédiate.
             *      \return <code>""</code> si le support a été correctement chargé ou l'intitulé de l'erreur si une erreur a été rencontrée par le serveur lors du chargement (dans le cas où \a imm = <tt>true</tt>).
             *      \warning Dans le cas où l'environnement sélectionné par le client charge le support, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
             *      \sa OpeServerLoadSupport. */
    	std::string loadSupport(std::string const & sn, cogitant::iSet env=cogitant::ISET_NULL, bool imm=true);
    	/**     Sauvegarde d'un support côté serveur.
             *      \param sn nom du fichier support.
             *      \param imm exécution immédiate ou pas.
             *      \return <code>""</code> si le support a été correctement sauvé ou l'intitulé de l'erreur.
             *      \sa OpeServerSaveSupport. */
    	std::string saveSupport(std::string const & sn, bool imm=true);
    	/** Chargement d'un support dans le serveur à partir du support du client.
             *      \result <code>""</code> si le support a été correctement chargé ou l'intitulé de l'erreur si une erreur a été rencontrée par le serveur lors de l'analyse du support envoyé par le client.
             *      \warning Si le support du client est issu du serveur, un grand nombre de requêtes peuvent être envoyées au serveur pour récupérer entièrement le support... afin de lui renvoyer. Il est donc raisonnable d'utiliser cette méthode dans le cas où le support est local au client, mais pas dans le cas où le support est issu du serveur. */
    	std::string commitSupport(bool imm=true);
    	/** Chargement de graphes dans le serveur.
             *      \warning Habituellement, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
             *      \result identificateurs des graphes chargés.
             *      \sa OpeServerLoadGraphs. */
    	std::vector<cogitant::iSet> loadGraphs(std::string const & gn, bool imm=true);
    	/**     Sauvegarde d'un graphe (ou d'un règle) côté serveur.
             *      \param gn nom du fichier (il s'agit du nom du fichier pour le serveur, si un nom relatif est donné, ce sera relativement au répertoire courant du serveur).
             *      \param i identificateur du graphe dans l'environnement courant du client.
             *      \param imm exécution immédiate ou pas.
             *      \result <code>""</code> si le graphe a été correctement sauvegardé, ou l'intitulé de l'erreur. (toujours "" si \a imm vaut faux).
             *      \sa OpeServerSaveEnvironmentObjects. */
    	std::string saveEnvironmentObject(std::string const & gn, cogitant::iSet i, bool imm=true);
    	/**     Sauvegarde de graphes (ou règles) côté serveur.
             *      \param gn nom du fichier (il s'agit du nom du fichier pour le serveur, si un nom relatif est donné, ce sera relativement au répertoire courant du serveur).
             *      \param ids identificateur du graphe dans l'environnement courant du client.
             *      \param imm exécutoin immédiate ou pas.
             *      \result <code>""</code> si le graphe a été correctement sauvegardé, ou l'intitulé de l'erreur. (toujours "" si \a imm vaut faux).
             *      \sa OpeServerSaveEnvironmentObjects. */
    	std::string saveEnvironmentObjects(std::string const & gn, std::vector<cogitant::iSet> const & ids, bool imm=true);
    	/** Destruction d'un environnement.
             *      \warning Plus aucun autre accès à l'environnement ne doit être fait après appel à cette méthode.
             *      \result \c true si l'environnement a été correctement détruit et \c false si l'environnement n'a pu être détruit. Attention, la méthode retourne \c false si \a imm vaut \c false.
             *      \sa OpeServerDeleteEnvironment. */
    	bool deleteEnvironment(cogitant::iSet i=cogitant::ISET_NULL, bool imm=true);
    	/** Force un rafraichissement de l'environnement depuis le serveur.
             *      Cette méthode doit être appelée pour prendre en compte de nouveaux objets de l'environnement créés dans le serveur ainsi qu'une éventuelle mise à jour de la taille du support. Après appel à cette méthode, le nombre d'objets de l'environnement est à nouveau synchronisé avec le serveur. */
    	void refreshEnvironment(bool imm=true);
    	/** Force un rafraichissement depuis le serveur d'un élément de l'environnement.
             *      Le rafraichissement n'est pas effectué immédiatement, mais uniquement lors du premier accès à l'objet en question.
             *      \param i identificateur de l'objet de l'environnement à refraichir, ou ISET_NULL, si tous les objets doivent être rafraichis.
             *      \warning Si des modifications ont été effectuées sur l'objet local, et que ces modifications n'ont pas été répercutées sur le serveur, alors ces modifications sont perdues car l'objet local est supprimé. */
    	void refreshEnvironmentObject(cogitant::iSet i = cogitant::ISET_NULL);
    //@}
     
    	/** Envoi des requêtes en attente au serveur et attente de la réponse. */
    	void executePendingQueries();
    };
     
    /** \class SupportAllocatorClient cs/client.h "cogitant/cs/client.h"
     *      Allocateur pour les membres de Support dans un client.
     *      Cette classe diffère de cogitant::SupportAllocator par le fait que les ensembles (de types de concepts, de types de relations, de types d'emboîtements, de marqueurs individuels) et les ordres partiels alloués sont les versions "client" des classes, afin de permettre la communication avec le serveur. */
    class CGTDLLEXPORT_CS SupportAllocatorClient: public cogitant::SupportAllocator
    {
    private:
    	/** %Client auquel est rattaché l'allocateur. */
    	Client * m_client;
     
    public:
    	/** Constructeur.
             *      \param client %Client auquel est rattaché l'allocator.
             *      Cette information doit être connue au moment de l'exécution des méthodes d'allocation afin de créer des \e Set reliés au serveur par l'intermédiaire de ce client.*/
    	SupportAllocatorClient(Client * client);
    /** @name Allocation. */
    //@{	
    	cogitant::Set<cogitant::ConceptType*>* allocCTypes() const;
    	cogitant::Set<cogitant::RelationType*>* allocRTypes() const;
    	cogitant::Set<cogitant::NestingType*>* allocNTypes() const;
    	cogitant::Set<cogitant::Individual*>* allocIndividuals() const;
    	cogitant::PartialOrder* allocCOrder() const;
    	cogitant::PartialOrder* allocROrder() const;
    	cogitant::PartialOrder* allocNOrder() const;
    //@}
    /** @name Effacement. */
    //@{
    	void clearCTypes(cogitant::Set<cogitant::ConceptType*> * s) const;
    	void clearRTypes(cogitant::Set<cogitant::RelationType*> * s) const;
    	void clearNTypes(cogitant::Set<cogitant::NestingType*> * s) const;
    	void clearIndividuals(cogitant::Set<cogitant::Individual*> * s) const;
    //@}
    };
     
    /** \class EnvironmentAllocatorClient cs/client.h "cogitant/cs/client.h"
     *      Allocateur pour les membres de Environment dans un client.
     *      Cette classe diffère de cogitant::EnvironmentAllocator par le fait que le support créé est muni d'un allocateur de type SupportAllocatorClient. */
    class CGTDLLEXPORT_CS EnvironmentAllocatorClient: public cogitant::EnvironmentAllocator
    {
    private:
    	/** %Client auquel est rattaché l'allocateur. */
    	Client * m_client;
    	/** %Support local.
             *      Si vrai, le support est créé localement, et son allocateur est celui par défaut. Sinon (par défaut), le support est distant est récupéré dynamiquement sur le serveur, et l'allocateur des supports créés est m_supportallocator. */
    	bool m_supportlocal;
    	/** Objets locaux.
             *      Si vrai, seul le support est récupéré sur le serveur : les objets sont locaux (faux par défaut). */
    	bool m_objectslocal;
     
    public:
    	/** Constructeur.
             *      \param client %Client auquel est rattaché l'allocator.
             *      Cette information doit être connue au moment de l'exécution des méthodes d'allocation afin de créer un cogitant::Support muni d'un SupportAllocatorClient relié au bon client. */
    	EnvironmentAllocatorClient(Client * client);
    	/** Destructeur. */
    	~EnvironmentAllocatorClient();
     
    protected:
    	/**     Construction d'un nouveau allocateur de support pour un environnement créé par l'objet courant. */
    	virtual	SupportAllocatorClient * newSupportAllocator() const;
     
    public:
    /** @name Allocation. */
    //@{	
    	cogitant::Support* allocSupport() const;
    	cogitant::Set<cogitant::EnvironmentObject*>* allocObjects() const;
    //@}
    /** @name Effacement. */
    //@{
    	void clearObjects(cogitant::Set<cogitant::EnvironmentObject*>* s) const;
    	void replaceObject(cogitant::Set<cogitant::EnvironmentObject*>* s, cogitant::iSet i, cogitant::EnvironmentObject* o) const;
    //@}
     
    	/** Stockage des objets.
             *      Si \c true les objets (graphes et règles) sont stockés sur le client, sinon (ou si cette méthode n'est pas appelée) les objets accessibles sont ceux du serveur.
             *      \warning Cette méthode doit être appelée avant l'allocation de l'ensemble d'objets. */
    	void localObjects(bool local=true);
    	/** Stockage du support.
             *      Si \c true le support est stocké sur le client, sinon (ou si cette méthode n'est pas appelée) le support est celui du serveur.
             *      \warning Cette méthode doit être appelée avant l'allocation du support. */
    	void localSupport(bool local=true);
    };
     
    }
    #endif
    Mon deuxième problème est:
    Je veux éttendre la classe Client, alors j'ai défini une classe m_classe qui hérite de Client ou j'ai rajouté une méthode.

    Et je veux que ma nouvelle classe Client_TCP2 hérite aussi de la nouvelle classe m_client et non pas l'ancienne classe Client.

    Donc j'ai pensé à définir ma classe Client_TCP2 en faisant un héritage multiple; un pour la classe Client_TCP et l'autre m_client. Si c'est ce qu'il me faut faire, comment dois je gérer mes constructeurs dans ce cas.

    Merci

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Le seul constructeur que j'ai vu est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client(OperationCSIO * opeio, bool localsupport, bool localobjects);
    et ce n'est pas un constructeur par défaut pour ta classe (comprendre un constructeur que l'on peut appeler sans argument).

    Or le seul moyen que ton code compile, c'est que ta classe Client offre un constructeur par défaut. Je ne comprends pas comment ton code compile.

    PS: si tu pouvais éviter de copier coller du code inutile, ca serait plus facile à lire.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Points : 40
    Points
    40
    Par défaut
    Ce que je veux savoir surtout c'est: pourquoi dans le code de la bibliothèque je trouve la définition de la classe Client_TCP héritant de la classe Client sans appeler le constructeur de cette dernière.

    Voici la classe Client_TCP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class CGTDLLEXPORT_CS_CCXX Client_TCP: public Client
    {
    public:
    		/** Constructeur.
                     *      \param host nom d'hote du serveur.
                     *      \param port numéro du port du serveur.
                     *      \param localsupport si \c true le support est local au client, et le serveur n'est jamais interrogé pour obtenir le support. Si \c false il ne faut pas charger un support dans l'environnement associé au client, car le support de l'environnement est celui du serveur.
                     *      \param localobjects si \c true les objets de l'environnement sont locaux, et le serveur n'est jamais interrogé pour obtenir les objets. */
    		Client_TCP(std::string const & host, unsigned int port=4246, bool localsupport=false, bool localobjects=false);
    };
    Et voici la classe Client:
    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
    class CGTDLLEXPORT_CS Client: public Base
    {
    private:
    	/// Environnement géré par le client.
    	cogitant::Environment* m_environment;
    	/// Identificateur de l'environnement dans le serveur.
    	cogitant::iSet m_idenv;
    	/// Stockage des requêtes en attente.
    	cogitant::XmlDocument m_pendingqueries;
    	/// Stockage de la dernière réponse reçue du serveur.
    	cogitant::XmlDocument m_answer;
    	/// Informations sur le serveur.
    	cogitant::PropertySet m_serverinfo;
    	/// Stockage du dernier résultat de la requête de comparaison.
    	cogitant::PartialOrder::Comparison m_comparisonresult;
    	///	Les environnements créés dans ce client ont un support local.
    	bool m_localsupport;
    	///	Les environnements créés dans ce client ont des graphes locaux.
    	bool m_localobjects;
    
    public:
    /** @name Constructeurs - destructeur. */
    //@{
    	/** Constructeur par défaut.
    	 *	\param opeio opérations d'entrées/sorties utilisées par le client pour communiquer avec le serveur.
    	 *	\param localsupport si \c true le support est local au client, et le serveur n'est jamais interrogé pour obtenir le support. Si \c false il ne faut pas charger un support dans l'environnement associé au client, car le support de l'environnement est celui du serveur.
    	 *	\param localobjects si \c true les objets de l'environnement sont locaux, et le serveur n'est jamais interrogé pour obtenir les objets. */
    	Client(OperationCSIO * opeio, bool localsupport, bool localobjects);
    	/** Destructeur.
    	 *	\warning La destruction du client ne provoque pas la destruction de l'environnement (de cette façon, il est possible de couper la connexion avec le server et de conserver l'environnement obtenu, dans ce cas, il est toutefois impossible d'obtenir de nouvelles informations du serveur). */
    	virtual	~Client();
    //@}
    
    .
    .
    etc
    Alors que moi quand je défini ma classe Client_TCP2 héritant de Client_TCP je dois spécifier mon constructeur comme vous m'avez conseillé, quelque chose de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Client_TCP2 : public Client_TCP
    {
    public:
    Client_TCP2(const std::string& s):Client_TCP2(s){}
    };
    En plus, je comprends pas pourquoi dans les commentaire du code de la classe Client il est écris que le constructeur est par defaut alors que aucune valeur par défaut n'a été définie, et d'un autre coté quand celà marche très bien, c'est à dire j'appelle Client_tcp sans les paramètres de client et le compilateur ne signale aucune erreur.

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Une chose que j'ai oublié de préciser, l'appel du constructeur parent se fait lors de la définition du constructeur et non lors de sa déclaration.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class A{
    A(); // déclaration
    };
     
    A::A() //définition
    {}
    Dans le cadre d'un héritage, on peut très bien avoir quelque chose comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A
    {
    A(int n){}
    };
     
    class B: public A
    {
    B(bool b);
    };
     
    B::B(bool b): A(10) //ici appel du constructeur parent
    {
     
    }
    C'est sans doute ce qui se passe ici, un appel "en dur" du constructeur parent (les paramètres ne sont pas des variables que le constructeur enfant envoie à la classe mère)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Points : 40
    Points
    40
    Par défaut
    Ok merci. J'ai bien compri maintenant.

    Merci bien

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/09/2007, 14h01
  2. [POO] héritage de constructeurs
    Par benkunz dans le forum Langage
    Réponses: 2
    Dernier message: 03/04/2007, 15h29
  3. Héritage et constructeur
    Par shirya dans le forum C#
    Réponses: 2
    Dernier message: 07/02/2007, 17h23
  4. Réponses: 10
    Dernier message: 20/09/2006, 17h04
  5. [POO]héritage du constructeur de la classe parente
    Par new_wave dans le forum Langage
    Réponses: 7
    Dernier message: 10/03/2006, 14h25

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