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 :

Problème de conception : copy de classe interdite


Sujet :

C++

  1. #1
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut Problème de conception : copy de classe interdite
    Bonjour,

    je rencontre un petit soucis de conception de mon application.

    Je suis en train de faire une classe qui exécute des requêtes HTTPS/HTTP avec la librairie réseau Poco::Net.

    Mon soucis est le suivant, lorsque l'on exécute une requête, les paramètres du header et le body sont dans deux éléments distincts :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // istream = body		res = header.
    std::istream& rs =  m_session.get()->receiveResponse(res);
     
    // On peut certainement mieux faire si vous avez une idée..
    uint32_t len;
    rs.read((char*)& len, 2);
    std::string test(len, '\0');
    rs.read(&test[0],len);
    J'aimerai avoir un objet qui contient à la fois le header et le body et le retourner lorsque l'on effectue une requête, voila la signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResponseHTTP sendHttpsRequest();
    Seulement voila le Poco::Net::HTTPResponse déclare le copie en privé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private:
    	enum Limits
    	{
    		MAX_VERSION_LENGTH = 8,
    		MAX_STATUS_LENGTH  = 3,
    		MAX_REASON_LENGTH  = 512
    	};
     
    	HTTPStatus  _status;
    	std::string _reason;
     
    	HTTPResponse(const HTTPResponse&);
    	HTTPResponse& operator = (const HTTPResponse&);
    };
    Comment faire cela proprement ? (Il est toujours possible de copier tous les champs de la httpResponse, mais je pense qu'il doit exister mieux).

    Merci de votre aide.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    La copie est déclarée en privée pour éviter que les objets de type Response ne soient dupliqués mais ce n'est pas un problème au contraire. Je n'arrive pas à comprendre ce qui te gêne du coup ?

    Si l'objet de type Response de Poco contient ton header et ton body c'est bien ce que tu veux du coup tu l'as

    Je me demande d'ailleurs : en terme de sécurité ce ne serait pas normal ?
    Nullius in verba

  3. #3
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Si l'objet de type Response de Poco contient ton header et ton body c'est bien ce que tu veux du coup tu l'as
    L'objet de poco ne contient que le header, le body est dans le stream.

    La copie est déclarée en privée pour éviter que les objets de type Response ne soient pas dupliqués mais ce n'est pas un problème au contraire. Je n'arrive pas à comprendre ce qui te gêne du coup ?
    Le truc c'est que je fais une classe cliente http. J'aimerai que l'utilisateur puisse faire quelque chose ressemblant 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
     
    HTTPSClient client;
     
    client.setURL("blalbla");
     
    // Response http contient l'entier du message (HTTPResponse + string)
    ResponseHTTP response= client.sendRequest()
     
    // Traitement de la requête ..
    // Exemple voir si elle s'est bien déroulé.
     
    if (response.getStatus != 200)
    {
       std::cout << "Une erreure est survenu...." << std::endl;
    }
    Mais comme la copie est en privé je ne peux pas retourner un HTTPResponse.

    J'espère que je suis un peu plus claire sinon n'hésiter pas à demander des précisions

    Je me demande d'ailleurs : en terme de sécurité ce ne serait pas normal ?
    J'ai pas compris ce que tu veux dire par la.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Si cette lib Poco ne gère pas la sémantique de mouvement qui concerne précisément ce genre de cas, il est toujours possible de contourner le problème avec un shared_ptr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef std::shared_ptr<HTTPResponse> HTTPResponsePtr;
     
    ResponseHTTPPtr sendHttpsRequest() { ... }
     
    ...
     
    HTTPResponsePtr response = sendHttpsRequest();
    response->method();

  5. #5
    Membre confirmé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Points : 597
    Points
    597
    Par défaut
    Oui c'est une bonne piste, je me demande alors quelle est la meilleure solution :

    1. Etendre la classe HTTPResponse, et utiliser des sharedPtr en retour :


    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
     
     
    typedef std::shared_ptr<ResponseHTTP> ResponseHTTPPtr;
     
    // Signature d'une requête https :
    ResponseHTTPPtr sendHttpsRequest();
     
    // Classe retourné par les requêtes
    class ResponseHTTP : public Poco::Net::HTTPResponse
    {
       public:
           // ... setter/getter m_body
     
        private:
           std::string m_body;
    }
    Ou alors d'intégrer le Poco::Net::HTTPResponse dans mon conteneur.

    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
     
     
    typedef std::shared_ptr<HTTPResponse> HTTPResponsePtr;
     
    // Signature d'une requête https :
    ResponseHTTP sendHttpsRequest();
     
    // Classe retourné par les requêtes
    class ResponseHTTP : public Poco::Net::HTTPResponse
    {
       public:
           // Accès directe aux datas en publique.
           shared_ptr<HTTPResponse> m_header;
     
        private:
           std::string m_body;
     
    }

    Merci

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

Discussions similaires

  1. Diagramme de classe : Problème de conception
    Par looking_4truth dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 12/07/2012, 00h35
  2. probléme de conception des salle modulable dans un diagramme de classe
    Par sampaiX dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 21/04/2010, 01h18
  3. Réponses: 0
    Dernier message: 09/11/2008, 15h33
  4. [débutant]Problème de conception de class
    Par pingoui dans le forum Langage
    Réponses: 23
    Dernier message: 07/04/2008, 11h30
  5. [POO] Classe Abstract : problème de conception
    Par viviboss dans le forum Langage
    Réponses: 22
    Dernier message: 14/12/2006, 16h37

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