Bonjour à tou(te)s,

J'ai un souci que je n'arrive vraiment pas à régler et plus je m'y essaye, plus j'ai l'impression de ne pas voir l'évidence.
Je cherche donc à faire un client Telnet. Pour cela, j'ai donc une classe Telnet qui me permet de me connecter à un serveur. Pour bien recevoir les données du serveur je lance un Thread qui va vérifier si j'ai recu des données de temps en temps. Pour info, j'utilise la SFML tout 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
15
16
17
18
19
20
21
22
class Telnet
{
public :
    //Constructeur par défaut
    Telnet(void);
    //Connexion à un site
    void Connect(const std::string& host, unsigned short port = 23);
    //Pour vérifier qu'on est bien connecté
    bool IsConnected(void);
 
private :
    //Les informations de connexion
    std::string     mHostName;
    sf::IPAddress   mHost;
    unsigned short  mPort;
    //La socket permettant de recevoir et d'envoyer des données
    sf::SocketTCP   mConnection;
    //Booléen permettant de savoir si on est toujours connecté ou pas
    bool            mIsConnected;
    //Le thread de réception des données envoyées par le serveur
    ReceptionThread mReceptionThread;
};
La methode lance donc le Thread qui est une classe dérivée afin qu'il fasse bien ce que je souhaite (méthode virtuelle redéfinie) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
class ReceptionThread : public sf::Thread
{
private:
    virtual void Run ()
    {
        std::cout<<"Deconnexion"<<std::endl;
        mIsConnected = false;
    }
};
Bon, ici ce n'est qu'un test, donc je déconnecte tout de suite. Voici le code du main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    Telnet t;
 
    t.Connect("crawl.akrasiac.org");
 
    while (t.IsConnected())
    {
        //On attend sans rien faire
    }
 
    return EXIT_SUCCESS;
}
Mes soucis :
- Soit je définis une classe avant l'autre et j'ai des soucis puisque l'autre n'est pas encore définie. Je sais qu'il faut définir partiellement la première afin de ne pas faire d'erreur, mais je n'arrive plus à retrouver comment on fait :/
- De plus, l'accès à un membre privé, c'est moyen. Je ne veux, bien entendu, pas avoir de setter public ca n'a rien à faire dans l'interface.

J'ai tenté de définir ReceptionThread dans la classe Telnet en privé puisque l'utilisateur ne devrait pas y avoir accès et de rendre celle-ci amie de la classe Telnet, masi ca ne marche pas :
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
class Telnet
{
public :
    //Constructeur par défaut
    Telnet(void);
    //Connexion à un site
    void Connect(const std::string& host, unsigned short port = 23);
    //Pour vérifier qu'on est bien connecté
    bool IsConnected(void);
 
private :
    friend class ReceptionThread;
 
    class ReceptionThread : public sf::Thread
    {
    private:
        virtual void Run ()
        {
            std::cout<<"Deconnexion"<<std::endl;
            mIsConnected = false;
        }
    };
 
    //Les informations de connexion
    std::string     mHostName;
    sf::IPAddress   mHost;
    unsigned short  mPort;
    //La socket permettant de recevoir et d'envoyer des données
    sf::SocketTCP   mConnection;
    //Booléen permettant de savoir si on est toujours connecté ou pas
    bool            mIsConnected;
    //Le thread de réception des données envoyées par le serveur
    ReceptionThread mReceptionThread;
};
Citation Envoyé par Debug
error: invalid use of nonstatic data member 'Telnet::mIsConnected'
Merci d'avance à ceux (celles ?) qui auraient des (une au moins ?) idées !

PS : post identique sur le SdZ, mais ils répondent pas