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++Builder Discussion :

Class, inline et AnsiString


Sujet :

C++Builder

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    135
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 135
    Par d�faut Class, inline et AnsiString
    Bonjour,

    J'ai cr�� une Class:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Client
    {
        public:
         int            Handle;
         AnsiString Name;
         AnsiString Password;
         char          Tel[10];
         void Create(int handle, AnsiString Name, AnsiString password, char tel[10]);    
    };
    et un inline
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    inline void Client::Create(int handle, AnsiString name, AnsiString password, char tel[10])
    {   
         Handle    = handle;
         Name      = name;
         Password = password;
         strcpy(Tel, tel); 
    }
    mais j'ai un message d'avertissement inline...

    Egalement d�clar� un vecteur
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
        vector <Client> vecClient;
        vector <Client>::iterator iterClient;
    et dans ma class de la form
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
        vecClient vClient;
        iterClient itClient;
    et j'ai un message d'erreur comme quoi Create n'existe pas quand j'utilise le vector pour cr�er un client
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
        vClient.push_back(Create(2, "Toto", "****", "0320534704"));
    pouvez-vous m'aiguiller?

  2. #2
    Membre �prouv�
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifi�)
    Inscrit en
    D�cembre 2004
    Messages
    2 059
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activit� : OPNI (Objet Programmant Non Identifi�)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 2 059
    Par d�faut
    Bonsoir,
    Juste une proposition:
    ....
    Ne faut il pas d�clarer une instance de la class 'Client' dans la TForm ?
    C'est a dire mettre en .H:
    et apr�s appeler sa m�thode avec :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    AClient.Create(...);
    @ +

  3. #3
    Membre �clair�
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Par d�faut
    Bonjour

    A la place de ta fonction Create, mets un constructeur pour ta classe Client, le constructeur porte le mon de la classe :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // dans ta déclaration de classe
    Client(int handle, AnsiString Name, AnsiString password, char tel[10]); 
     
    // dans le fichier .cpp
    Client::Client(int handle, AnsiString name, AnsiString password, char tel[10])
    {   
         Handle    = handle;
         Name      = name;
         Password = password;
         strcpy(Tel, tel); 
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    vector <Client> vecClient;
    L� tu cr�e un vecteur d'objets de type Client et ce vecteur s'appelle vecClient.
    Si tu veux remplir le vecteur, tu y mets des objets Client.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Client Zidane = new Client(2, "Toto", "****", "0320534704");
    vecClient.push_back(*Zidane);
    Quelque chose comme �a doit marcher.
    Laisse tomber les inline, tu les utiliseras plus tard.

    Un apprentissage des notions de base de C++ au moyen d'un bon bouquin te faciliterais beaucoup les choses (C++ facile, N� 889, editions Marabout, pas cher)

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    mais j'ai un message d'avertissement inline...
    Les fonctions inline doivent �tre enti�rement d�finies dans des en-t�tes (pas dans des .cpp). La raison est simple : un appel � une fonction inline �tant remplac� par le code de la fonction, si celui-ci n'est pas disponible le compilo ne pourra pas faire son boulot.

    Client Zidane = new Client(2, "Toto", "****", "0320534704");
    vecClient.push_back(*Zidane);
    Rien de mieux pour chopper des fuites de m�moire (qui va d�truire l'instance que tu as allou�e dynamiquement ?)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vecClient.push_back(Client(2, "Toto", "****", "0320534704"));

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    135
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 135
    Par d�faut
    Les fonctions inline doivent �tre enti�rement d�finies dans des en-t�tes (pas dans des .cpp). La raison est simple : un appel � une fonction inline �tant remplac� par le code de la fonction, si celui-ci n'est pas disponible le compilo ne pourra pas faire son boulot.
    Dans mon exemple c'est ce que j'ai fait, la fonction inline est d�clar�e juste en dessous de ma class Client dans le m�me fichier.h
    Rien de mieux pour chopper des fuites de m�moire (qui va d�truire l'instance que tu as allou�e dynamiquement ?)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    vecClient.push_back(Create(2, "Toto", "****", "0320534704"));
    Donc la solution c'est quoi?
    Je me base sur le livre de G Leblanc.
    Sauf que cette syntaxe me cause une erreur disant que Create n'est pas un membre de la class Client!

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Dans mon exemple c'est ce que j'ai fait, la fonction inline est d�clar�e juste en dessous de ma class Client dans le m�me fichier.h
    Ah, autant pour moi...
    Commen�ons dont par le d�but : quel est le message d'avertissement que te donne le compilo ?

    Donc la solution c'est quoi?
    Je me base sur le livre de G Leblanc.
    Sauf que cette syntaxe me cause une erreur disant que Create n'est pas un membre de la class Client!
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vecClient.push_back(Create(2, "Toto", "****", "0320534704"));
    Je n'ai pas �crit �a... Relis mon post.

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    135
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 135
    Par d�faut
    D�sol�, par moyen de me connecter
    Voici le message de mon compilateur:
    [C++ Avertissement] fichier.h(45): W8026 Les fonctions prendre les arguments classe-par-valeur ne sont pas d�velopp�es inline
    On dirait que ceci est d� aux types AnsiString dans ma class

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Ca veut dire que comme tu passes tes param�tres par valeur, et que le constructeur par copie n'est pas trivial, le compilo ne peut pas inliner la fonction puisque cela signifierait �liminer l'appel au constructeur par copie.

    Passe simplement tes param�tres AinsiString par r�f�rence constante :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Create(int handle, const AnsiString& name, const AnsiString& password, char tel[10])
    PS : ils se sont pas foul�s pour la traduction des messages d'erreur... c'est vraiment caca

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    135
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 135
    Par d�faut
    Du coup j'obtiens ce message d'erreur!
    [C++ Avertissement] Fichier.h(97): W8027 Les fonctions contenant missing return statements ne sont pas d�velopp�es inline
    L'avertissement surligne la fin de la d�claration inline!

    J'ai une autre demande,
    O� et comment initialiser une class Toto?
    ex:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Toto
    {
        public:
        AnsiString Name;
        int           age;
        Toto();
        ~Toto();
    };
    Les constructeurs et destructeurs sont-ils obligatoires dans une appli bcb?
    O� initialiser ma class Toto et comment dans mon *cpp?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
        ...
        Toto toto("tata", 23); // me donne une erreur de correspondance

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    [C++ Avertissement] Fichier.h(97): W8027 Les fonctions contenant missing return statements ne sont pas d�velopp�es inline
    On peut voir ta fonction ?

    O� et comment initialiser une class Toto?
    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
    class Toto
    {
    public :
     
        Toto(const AnsiString& Name_, int Age_);
     
        ...
    };
     
    Toto::Toto(const AnsiString& Name_, int Age_) :
    Name(Name_),
    Age(Age_)
    {
     
    }

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    135
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 135
    Par d�faut
    Franchement c'est pas encore clair pour moi les class, il y a trop de mani�res diff�rents de les aborder!
    Voici mon code:
    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
     
    class CLIENT
    {
        public:
        int        Handle;
        AnsiString UserName;
        AnsiString Password;
        int        Nk;
        int        Nb;
        char       Key[32];
     
        Create(int H, const AStr &N, const AStr &P, int nk, int nb, char key[32]);
        CLIENT() {}        // Constructeur par défaut
    };
     
    inline CLIENT::Create(int H, const AStr &N, const AStr &P, int nk, int nb, char key[32])
        {
            Handle   = H;
            UserName = N;
            Password = P;
            Nk       = nk;
            Nb       = nb;
            strcpy(Key, key);
        }
    J'obtiens donc une erreur,
    Comment initialiser CLIENT, sachant que j'ai d�clar� un vector de n CLIENT
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    typedef vector<CLIENT> VCLIENT;
    typedef vector<CLIENT>::iterator itVCLIENT;

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Comme on te l'a d�j� dit, il faut remplacer ta fonction Create par un constructeur. Un constructeur a toujours le m�me nom que la classe (voir mon exemple sur Toto, ou encore des bouquins / tutoriels si n�cessaire).

  13. #13
    Membre confirm�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    135
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 135
    Par d�faut
    mon constructeur c'est
    et il se trouve dans la d�claration de ma Create c'est une fonction quelconque �galement d�clar�e dans cette class CLIENT.

    Comment construire CLIENT vu que j'ai d�clar� un vector <CLIENT>?

    Merci

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Citation Envoy� par Laurent Gomila
    Comme on te l'a d�j� dit, il faut remplacer ta fonction Create par un constructeur
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    inline CLIENT::CLIENT(int H, const AStr &N, const AStr &P, int nk, int nb, char key[32])
        {
            Handle   = H;
            UserName = N;
            Password = P;
            Nk       = nk;
            Nb       = nb;
            strcpy(Key, key);
        }

  15. #15
    Membre �clair�
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Par d�faut
    Si tu utilise le vector de la STL, les objets que tu mets dans ton vecteur (ici ta classe Client) doivent obligatoirement avoir :
    * un constructeur par copie public
    * un constructeur par d�faut public
    * un destructeur public
    * un op�rateur d'affectation public

    Sinon la conservation des donn�es dans ton vector quand tu travailles dessus n'est pas garantie.
    Le constructeur et le destructeur peuvent �tre implicites. Ces 2 m�thodes n'ont aucun type.

    Par contre toutes les autres, comme la fonction Create auquel tu sembles tenir doivent avoir un type : void, int, etc... Par d�faut c'est int.
    Donc inline Toto(...) �quivaut � inline int Toto(...) et doit renvoyer un int.

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    * un constructeur par d�faut public
    Pas sp�cialement. Si on ne pouvait stocker dans un conteneur que des classes poss�dant obligatoirement un constructeur par d�faut, ce serait bien emb�tant.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 29/10/2014, 17h10
  2. [AJAX] [SRC] Ajout de classe au tutoriel d'Olivier Lance "modification inline de donn�es"
    Par dream_of_australia dans le forum Contribuez
    R�ponses: 8
    Dernier message: 27/10/2014, 19h25
  3. R�ponses: 1
    Dernier message: 29/05/2008, 09h52
  4. Une classe pour un tableau � 2dimensions de AnsiString ?
    Par whitespirit dans le forum C++Builder
    R�ponses: 5
    Dernier message: 10/12/2007, 15h08
  5. R�ponses: 3
    Dernier message: 14/12/2006, 10h09

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