Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment gérer une inclusion entremélée?

    5 novembre 2006 à 16:16:11

    re bonjour à tous, j'aurais voulu savoir comment gérer le fait que 2 classes ont besoin chacun l'une de l'autre?
    En effet j'ai 2 classe (serveur et interpreteur qui nécessite chacun l'autre classe
    le serveur contient l'interpreteur (de commande) et l'interpreteur a besoin de l'adresse du serveur (passé en paramètre à la création de celui ci)
    mais mon compilateur n'accepte pas le *serveur dans le code de l'interpreteur

    pour expliciter le cas, je vous montre une partie du code:


    serveur.h

    #include <iostream>
    #include <vector>
    #include <winsock2.h> // pour les fonctions socket
    #include <cstdio> // Pour les Sprintf
    #include <pthread.h>
    #include "connection.h"
    #include "interpreteur.h"
     
    // ********************************************************
    // Les librairies
    // ********************************************************
    #pragma comment(lib,"ws2_32.lib")


    using namespace std;


    class serveur
    {

    private:
            WSADATA initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
            int erreur; // Variable permettant de récupérer la valeur de retour des fonctions utilisées
            int tempo; // Variable temporaire de type int
            int nombre_de_caractere; // Indique le nombre de caractères qui a été reçu ou envoyé
            char buffer[65535]; // Tampon contenant les données reçues ou envoyées
            SOCKET id_de_la_socket; // Identifiant de la socket
            //SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket
            SOCKADDR_IN information_sur_la_source; // Déclaration de la structure des informations lié à l'écoute

            SOCKET id_de_la_nouvelle_socket;

            interpreteur *inte;
            vector<connection> clients;

            bool pause;
            bool running;
            connection *con;


    public:
            serveur();
            int kick(int clientid);
            void listclient();
            void setpause(bool val);
            bool isRunning();




    };

    void inline serveur::setpause(bool val)
    {
            pause = val;
    }


    bool inline serveur::isRunning()
    {
            return running;
    }

    #endif





    et interpreteur.h


    /*
    interpreteur.h
    auteur:jolrael
    role: interpreter des commandes tel que list, pause, kick....
    */


    #ifndef INTERPRETEUR_H
    #define INTERPRETEUR_H
    #include <stdio.h>
    #include <iostream>

    #include <winsock2.h> // pour les fonctions socket
    #include <cstdio> // Pour les Sprintf
    #include <pthread.h>




    class interpreteur
    {

    private:
            pthread_t th;
            char buffer[65535];
            serveur *serveur;

    public:
            interpreteur(serveur *serv);
            void *inter (void *p_data);
            ~interpreteur();




    };


    #endif






    interpreteur::interpreteur(serveur *serv)
    {
            serveur =  serv;
            pthread_create (&th, NULL, inter, NULL);

    };



    j'ai essaillé en remplaçant le "serveur *serveur;"
    par un void *serveur avec un cast explicite dans le constructeur de l'interpreteur mais le resultat n'est pas celui escompté
    • Partager sur Facebook
    • Partager sur Twitter
      5 novembre 2006 à 16:19:12

      Dans intepreteur.h

      ...
      class serveur;

      class interpreteur
      {
      ...
      };

      dans interpreteur.cpp

      #include "interpreteur.h"
      #include "serveur.h"
      ...

      (au passage l'inline de ton serveur sert à ... ?)
      • Partager sur Facebook
      • Partager sur Twitter
        5 novembre 2006 à 16:32:29

        pour les inline, c'est une habitude que j'ai prise (est elle bonne?)
        en general les accesseurs/modificateurs je les met en inline.


        sinon avec ce que tu m'a conseillé de faire, il a toujours du mal pour le constructeur


        c:\documents and settings\~~\interpreteur.h(31) : error C2327: 'interpreteur::serveur' : is not a type name, static, or enumerator

        public:
        interpreteur(serveur *serv);
        • Partager sur Facebook
        • Partager sur Twitter

        comment gérer une inclusion entremélée?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown