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