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 :

problemme de CLASS C++


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Octobre 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 1
    Par défaut problemme de CLASS C++
    salut tt le monde,
    je veux avoir access à tt les moembres (Privé et public) d'une class, et je ne sais pas exactement comment je doit faire.
    j'ai utiliser en 1er lieu l'héritage, mé sa donne des erreurs.
    'c_irc.h' 'In function 'int main(int, char **)':
    44 'c_irc.h' 'char *ircconnect::get_irc_server() is inaccessible'
    12 'main.cpp' 'within this context'
    12 'main.cpp' 'ircconnect is not accessible base of "irccl"'
    Makefile '[Build Error] [main.obj] Error 1'
    voila la déclaration des deux class

    j'utilise DEC-C++ (GCC comme compilateur).
    plz dite moi comment faire ... merci

    #ifndef C_IRC_H
    #define C_IRC_H

    #include <cstdlib>
    #include <cstring>
    #include <winsock2.h>
    #include <windows.h>
    #include <cstdio>

    #define ERROR_DEST "__NO_DESTINATION__"
    #define NO_CHANNEL "__NO_CHANNEL__"
    #define NO_NIKE_DEST "__NO_NIKE_DESTINATION__"
    #define MARGE 5

    //--- Classe IRC Connect, pour la connexion sur un serveur IRC
    class ircconnect {
    private:
    SOCKET sock;
    SOCKADDR_IN sin;
    DWORD thread_id;
    in_addr addr;
    struct hostent *host;
    char *nike_name;
    char *irc_srv;
    char *irc_channel;
    int port_srv;
    bool in_new_thread;
    bool auto_connection;
    char *buffer;
    void init_socket(void);

    public:
    ~ircconnect();
    ircconnect(char *irc_server, char *nikename, int port, bool in_new_thread_);
    void irc_join(char *irc_channel);
    bool init_irc_connection(void);
    bool close_irc_connection(void); // pour férmer la connection
    void auto_connect(bool auto_con); // pour verifier si la connexion existe tt jour
    bool irc_ping(void);
    void stok_recv_message(void);
    int send_message(char *destination, char *message, char *command);

    char *get_nike_name(void); //trouver mon nikename
    char *get_irc_server(void); //trouver l'adresse du serveur
    char *get_irc_channel(void); //trouver le nom du channel
    int get_server_port(void); //trouver le numero de port
    char *get_message(void); //donne la message originalle
    //********************************************************//

    };

    //---- Classe IRCCL pour le traitement des messages
    class irccl : ircconnect {
    private:
    char *nike_name_exp;
    char *nike_info;
    char *irc_command;
    char *irc_message;
    char *destination;
    bool tochannel;
    bool tome;

    public:
    ~irccl();
    irccl(void);
    // void irc_info(char *irc_msg);
    void splitmessage(char *irc_msg); //decoupe le message qui arrive depuis le serveur IRC
    char *get_nikename_exp(void); //donne le nikename de l'expediteur
    char *get_nike_info_exp(void); //donne la partie abstré du nike name
    char *get_command(void); //donne la command evyer avec le message
    char *get_nike_destination(void); //donne la destination
    char *get_destination(void); //idem
    char *deletenewline(char *irc_msg); //supprime le caractaire \n à la fin
    char *deletespace(char *irc_command); //surpprime de dernier espace
    bool find_expeditor(char *nikenamefind); //chercher un expediteur
    bool find_command(char *commandfind); //chercher une commande
    bool find_message(char *messagefind); //chercher un message
    bool find_destination(char *destination); //chercher une destination
    bool is_message(char *irc_msg); //determiner si c'est un message ou non
    bool is_ping(char *irc_msg); //determiner si c'est un ping ou non
    bool is_tome(void); //determiner si le message et pour moi ou non
    bool is_for_channel(void); //determiner si le message et pour le channel ou nn
    //********************************************************//
    };


    #endif
    #include "c_irc.h"

    int main(int argc, char *argv[]) {
    irccl irc;
    ircconnect irc_c("irc.freenode.net", "GHOST", 6667, false);
    irc_c.init_irc_connection();
    printf("%s\n", irc_c.get_irc_server());
    printf("%s\n",irc.get_irc_server()); // Une erreur ce declance ici
    if(irc_c.close_irc_connection()) printf("La connection est ferme\n");
    else printf("Impossible de fermer la connction\n");
    return 0;
    }

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Les membres privés ne peuvent être utilisés que par leur classe ou par les éléments (autre classe, fonction...) "amis" de cette classe.

    Donc voir le fonctionnement du mot clé "friend" :
    http://c.developpez.com/faq/cpp/?page=friend

    Autre solution : créer des accesseurs...

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En effet, utilise les accesseurs qui sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type_variable laclasse::getVariable() const
    {
       return variable;
    }
    En mettant ces fonctions publiques, ca permet de récupérer la valeur de ta variable, parfois une référence si tu le désires, ou un pointeur meme, mais dans tous les cas ca force à appeler cette fonction pour utiliser la variable.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Tu dois aussi etre attentif à l'accessibilité de l'héritage...

    il me *semble* que, quand tu fais un héritage sans indiquer s'il est public, protege ou prive, le compilateur considère par défaut qu'il est privé (a confirmer/infirmer)

    Ce qui fait que, tous les membres et méhtodes, y compris ceux et celles déclarés en public, dans la classe de base, deviennent privé dans la classe dérivée, et que donc, tu ne peux pas y accéder au départ de ta fonction main.

    Si je ne dis pas de bêtise à ce sujet, il faudra déclarer ta classe irccl sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class irccl : public ircconnect 
    {
      //membre et méthode de irccl
    }
    de manière à disposer des accesseurs déclarés comme public dans ircconnect, dans la fonction main, par exemple
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    il me *semble* que, quand tu fais un héritage sans indiquer s'il est public, protege ou prive, le compilateur considère par défaut qu'il est privé (a confirmer/infirmer)
    Pour les "class" l'héritage par defaut est "private", pour les "struct" il est "public":
    In the absence of an access-specifier for a base class, public is assumed when the derived class is declared struct and
    private is assumed when the class is declared class.
    selon la norme (Draft n1905 chapitre 11.2 point 2)

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par seriousme
    Pour les "class" l'héritage par defaut est "private", pour les "struct" il est "public":

    selon la norme (Draft n1905 chapitre 11.2 point 2)
    Merci de la confirmation... C'est bel et bien ce que j'avais en tete, mais comme je n'avais pas la ressource sous les yeux, ben, voilà, j'ai préféré tempérer ma réponse
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Problemme d'execution d'une classe java en de hors de netbeans
    Par riyad25h dans le forum Collection et Stream
    Réponses: 0
    Dernier message: 05/07/2010, 10h08
  2. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  3. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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