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 :

J'instancier une méthode


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut J'instancier une méthode
    Bonjour,

    j'ai une methode ''SENDFRAME" qu est sur un fichier ANCREwifi.cpp.


    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
    /**
     * \brief Fonction permettant d'envoyer un message à une ancre
     *
     * \param num : numero de l'ancre destinataire (0 pour toutes)
     * \param sendFrameBuffer : buffer d'envoi du message
     * \param length : longueur du message
     *
     */
    void anchor::sendFrame( int num, QByteArray sendFrameBuffer, unsigned int length)
    {
        unsigned int start, stop;
        if( num == 0)
        {
            start = 1;
            stop = NbAnchor;
        }
        else
        {
            start = stop = num;
        }
        for(unsigned int i=start; i<=stop; i++)
        {
            if( (Connected[i] == CONNECTED) ||  (Connected[i] == CONNECTING) )
            {
                socket.at(i)->write(sendFrameBuffer, length);
            }
        }
    }

    je veux utiliser (instancier) cette methode dans un autre fichier "mainwindow.cpp"

    ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //...............................................................START.......................................................//
     
    void MainWindow::on_start_clicked()
    {
        unsigned int lenght;
     
                    //QByteArray frame ;
                    Frame[1]  = 0x80;
     
                    anchor::sendFrame(1,Frame,lenght);
    }
    quand je compile ca me sort ca ==
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'cannot call member function void anchor::sendFrame( int , QByteArray sendFrameBuffer, unsigned int ) without objets
    de quels objets il parle ??

    je vous mets aussi le AncreWifi.h

    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
    class anchor : public QObject
    {
        Q_OBJECT
    public:
        explicit anchor(QObject *parent = 0);
     
    signals:
        void setLed(unsigned char nbLed);
        void ackMode(unsigned int);
        void ackStart(unsigned int);
        void ackStop(unsigned int);
        void ackTabTag(unsigned int);
     
    public slots:
     
        void sendFrame(int num, QByteArray sendFrameBuffer, unsigned int length);
    Images attachées Images attachées  

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 684
    Points
    13 684
    Billets dans le blog
    1
    Par défaut
    Une méthode ne s'instancie pas, elle s'appelle puisqu'une une méthode est une fonction. En revanche, une classe s'instancie. L'instanciation d'une classe résulte en la création d'un objet, qu'on appelle instance. Pour appeler une méthode, il faut un objet (une instance) sur lequel la méthode s'appuie. Et c'est exactement ton message d'erreur : tu n'as pas d'objet de type anchor avec lequel faire my_anchor.sendFrame().

    Il est possible d'appeler une méthode sans objet à la condition que cette méthode soit statique. Voir http://en.cppreference.com/w/cpp/language/static

    Une autre solution est de ne pas utiliser de classe anchor. Tu peux définir des fonctions en dehors de toute classe en C++ (contrairement à Java par exemple).

    Tes questions ressemblent à des questions de débutant en C++. Avant d'aller plus loin, il serait bien que tu relises ton tutoriel sur les classes en C++.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    ca fait longtemps que j'ai pas programmer en c++, c pour ca j'ai perdu qlq bases.

    oui justement ma methode est bien static je sais qu il ya une astuce pour la faire appeler sans instance mais j ai oublié comment faire ...

    merci pour ton conseil

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 684
    Points
    13 684
    Billets dans le blog
    1
    Par défaut
    oui justement ma methode est bien static
    Qu'est ce qui te fait dire ça ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    "this" n'existe pas

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 199
    Points : 12 352
    Points
    12 352
    Par défaut
    "this" n'existe pas
    Ça c'est une conséquence du fait qu'une méthode est statique mais qu'est-ce qui te fait dire que la méthode "sendFrame" est statique dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class anchor : public QObject
    {
    ...
     
        void sendFrame(int num, QByteArray sendFrameBuffer, unsigned int length);
    ...
    }

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Ah d'accord, oui vous avez raison ce n 'est pas une statique, du coup il me faut absolument une instance (objet) .mais je pense que votre solution
    Une autre solution est de ne pas utiliser de classe anchor. Tu peux définir des fonctions en dehors de toute classe en C++
    est plus adéquate avec mon programme parce que je vais utilisé SENDFRAME ailleurs aussi. donc si vous pouvez m éclaircir SVP comment faire cette Méthode je serai très reconnaissant

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 684
    Points
    13 684
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas de projet Qt prêt sous la main, donc j'ai mimé ton organisation :

    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
    #include <iostream>
    using namespace std;
     
    namespace anchor
    {
        void sendFrame(int num, int start, int stop)
        {
            cout << num << start << stop << endl;
        }
    }
     
    void clicked_start()
    {
        anchor::sendFrame(42, 0, 666);
    }
    J'utilise un namespace anchor qui est optionnel, mais qui permet d'avoir des fonctions avec des noms simples sans risquer un conflit avec des noms d'autres bibliothèques ou d'autres parties du programme. Ca permet de plus une "thématisation" des fonctions.

    Note au passage que tu as une écriture très similaire avec une méthode statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class anchor
    {
    public:
        static void sendFrame(int num, int start, int stop)
        {
            cout << num << start << stop << endl;
        }
    };
     
    void clicked_start()
    {
        anchor::sendFrame(42, 0, 666);
    }
    Il est souvent dit que static n'est pas orienté objet car......tu n'as pas d'objet pour appeler la méthode ! Quitte à faire du structuré au milieu de POO, je trouve la solution des fonctions libres (mais fournies dans un namespace) plus "logique".

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    quand j'ai fait ca dans le mainwindow.cpp, ca me donne une noubelle erreur
    ''namespace anchor{}'redeclared as différent kind of symbol
    ?? et si j'utilise un autre namespace cela ne va pas faire reference a la methode souhaité -_-

Discussions similaires

  1. Appeller une méthode d'une autre classe sans l'instancier
    Par pitchu dans le forum Objective-C
    Réponses: 0
    Dernier message: 21/12/2016, 16h40
  2. Réponses: 8
    Dernier message: 23/12/2010, 11h32
  3. Réponses: 3
    Dernier message: 15/01/2008, 18h10
  4. [Reflection]Instanciation d'object en parametre d'une méthode
    Par mezoo dans le forum API standards et tierces
    Réponses: 19
    Dernier message: 31/08/2006, 13h00
  5. instanciation problématique dans une méthode ActiveX
    Par mr.saucisse dans le forum MFC
    Réponses: 14
    Dernier message: 17/01/2006, 17h34

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