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 :

[Débutant]Erreur compilation classe héritée


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut [Débutant]Erreur compilation classe héritée
    Bonjour,
    Pour des raisons de comoditées dans mon code (adaptation d'un programme en console sur wxWidget), j'ai dérivé la classe wxStaticText en une classe console, afin de surdéfinir l'opérateur '<<' pour qu'il écrive dans le label.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Console : public wxStaticText{
        public:
            void operator<<(const char* string);
            void operator<<(string string);
    };
    ]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Console::operator<<(const char* string){
        char* buff = strcat((char*)(this->GetLabel()).c_str(), (char*) string);
        this->SetLabel(buff);
    }
     
    void Console::operator<<(string string){
        this->SetLabel(this->GetLabel() + string);
    }
    Lorsque je teste la surdéfinition dans le main, tout fonctionne, mais lorsque
    j'y fait appelle dans une autre fonction (un client ftp, qui au lieu d'envoyer le log sur cout comme dans la console l'envoie sur un pointeur de type Console* log), j'ai droit a une erreur a chaque appelle de la surdéfinition "error: void value is not ignored as it ought to be"

    exemple:
    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
     
    class Client{
        private:
            int PortSnd, PortRec;
            char* adresse;
            char* login;
            char* pass;
            string CurDir;
            SOCKET Connexion;
            SOCKET Receive;
            WSAData Data;
            sockaddr_in clientService;
            sockaddr_in ReceptionService;
        public:
            Client(char adresse[], int PortSnd, char login[],char pass[], Console* log);
            int ConnectFTP();
            string SendFTP(char* Send);
            string RecResponse(SOCKET sock, u_long timeout=0);
            void Disconnect();
            void ChangeDir(char* Dir);
            void CreateDir(char* Dir);
            bool RecFile(char* FileName,char Type);
            bool SendFile(char* FileName,char Type);
            void GetList();
            void ParsePASV(string Response);
            string ParseLIST();
            Console* Log;
    };
     
    if(WSAStartup(MAKEWORD(2, 2),&(this->Data)) ) { 
            *Log << "Erreur lors de l'initialisation de Winsock: " << WSAGetLastError() << "\n"; //erreur de compilation juste ici :/
            exit(EXIT_FAILURE);
        }
    le client marche dans la console, mais la je ne comprends pas du tout l'erreur signalée. J'utilise GCC sous codeblock et windows.

    Merci d'avance de vos réponses

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tu chaines des appels a << alors que ton operateur << retourne void. Il faut lui faire retourner une reference vers son premier operande pour faire cela.

    Plus generalement, si tu veux disposer des operateurs <<, il vaut mieux definir ton propre streambuf. Voir la FAQ de f.c.l.c++ (http://www.cmla.ens-cachan.fr/~dosre..._entree_sortie) pour un exemple.

  3. #3
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tes opérateurs << renvoient void, pour chaîner les appels comme tu le fais ils devraient renvoyer un Console&.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* buff = strcat((char*)(this->GetLabel()).c_str(), (char*) string);
    Ca c'est vraiment très vilain. A mon avis les conversions automatiques de const char* en string ou wxString sont suffisantes pour ne pas avoir à faire de telles manips.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void operator<<(const char* string);
    void operator<<(string string);
    Ca aussi c'est très vilain, je doute que le compilo apprécie que tu nommes tes variables du même nom qu'un type

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Laurent Gomila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void operator<<(const char* string);
    void operator<<(string string);
    Ca aussi c'est très vilain, je doute que le compilo apprécie que tu nommes tes variables du même nom qu'un type
    Je suis d'accord que c'est pas beau, mais c'est autorise tant que les deux ne sont pas dans la meme portee.

Discussions similaires

  1. [MASM32][Débutant] Erreur de compilation
    Par Priest dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 02/10/2005, 02h06
  2. Réponses: 12
    Dernier message: 26/08/2005, 10h02
  3. [Débutant]Erreur de compilation inconprehensible
    Par @r$£~%[ dans le forum C++
    Réponses: 15
    Dernier message: 14/08/2005, 20h04
  4. [Débutant][JNDI] Erreur "bad class file"
    Par giffle dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/01/2005, 10h23
  5. [Débutant]Erreur compilation !
    Par gandalf_le_blanc dans le forum AWT/Swing
    Réponses: 23
    Dernier message: 30/08/2004, 14h23

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