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 :

Débutant problème d'héritage (class)


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut Débutant problème d'héritage (class)
    Salut,
    Bon je vais essayer d'être clair mai avec l'héritage c'est pas facile
    précision ce code est programmer sous geany et compiler avec g++
    excuser les commentaires en français mai je débute et il faut pouvoir ce relire (déjà que mon français...)

    Je cherche a en-capsuler du code système fait en C dans une class.
    ce code Ser a crée un trhead
    le problème est le suivant. :
    j'ai donc ma première classe
    qui a le cheminement suivant
    classe mere -->[public m_thread_create ]-->[private static m_thread_call] --->[protect virtual m_call_out_procedure]
    Bon donc jusque la c'est pas compliqué (hum....)
    Le problème est que le code a exécuté ce situera dans un autre fichier *. cpp il faut donc que depuis ce fichier je puisse ajouter le code a exécuté
    c'est pourquoi j'ai fait cela ici avec la class B (qui donc devrai ce retrouver dans un autre fichier. cpp) et l'erreur surviens (coller a la find du 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    fichier .h
    #ifndef DEF_PTREAD
    #define DEF_PTREAD
     
    #include <pthread.h>
    class c_thread
    {
    	public:
    				/*constructeur*/
    				c_thread();
    				/*destructeur*/
    				~c_thread();
    				/* methode*/
    				/*creation du thread*/
    				int m_thread_create();/*1 -->static void m_thread_call();*/
    				/*atribut*/
    	protected:
    				virtual void m_call_thread(){};/*3 --> ok*/
    	private:
    				/*methode privée*/
    				static void *m_thread_call(void *this_); /*2 --->[protect virtual m_call_thread]*/
    				/*obtenir le handle cree precedament*/
    				int get_handle();
    				/*attribut priver*/
    				pthread_t handle_;
    };
    class B{
    	public:c_thread
    	virtual void m_call_thread()
    	{
    		std::cout << "thread started" << std::endl;
    	};
    };
     
    #endif //fin des macro
    fichier .cpp
    #include "my_class_ptrhead.h"
     
    /*constructeur*/
    c_thread::c_thread() {};
    /*destructeur*/
    c_thread::~c_thread(){};
    /*creation du thread et renvoi du handle*/
    int c_thread::m_thread_create()
    {
    		pthread_create(&handle_, 0, c_thread::m_thread_call, static_cast<void *>(this));
    		return c_thread::get_handle() ;
    };
     
    /*obtenir le handle cree precedament*/
    int c_thread::get_handle() 
    {
    		return handle_;
    };
     
    void *c_thread::m_thread_call (void *data){
    	c_thread *base = static_cast<c_thread *>(data);
    	base->m_call_thread();
    	return 0;
    };
    fichier main.cpp
    #include <iostream>
    #include <string>
    #include <cstring>
    #include "my_class_ncurse.cpp"
    #include "my_class_ptrhead.cpp"
     
    int main()
    {
    	c_thread thread_p;
    	int id1_H = 0;
    	id1_H = thread_p.m_thread_create();
    	std::cout << id1_H << std::endl;
    };
     
    erreur:
    In file included from my_class_ptrhead.cpp:1,
                     from main.cpp:5:
    my_class_ptrhead.h:28: erreur: two or more data types in declaration of ‘m_call_thread’
    Merci d'avance

  2. #2
    Membre averti Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Points : 343
    Points
    343
    Par défaut
    Salut,

    Déjà, commence par supprimer les ";" qui suivent les accolades fermantes des fonctions que tu implémentes, il ne sont nécessaires que pour les prototypes de celles-ci.

    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int c_thread::m_thread_create()
    {
    		pthread_create(&handle_, 0, c_thread::m_thread_call, static_cast<void *>(this));
    		return c_thread::get_handle() ;
    }
    peut devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int c_thread::m_thread_create()
    {
    		pthread_create(&handle_, 0, m_thread_call, static_cast<void *>(this));
    		return get_handle() ;
    }
    car tu es déjà dans la classe c_thread, donc pas besoin d'utiliser l'opérateur de porté "::", utilise le par exemple pour indiquer que tu veux appeler la classe mère.

    Sinon tu parles d'héritages dans ton titre, mais je n'en vois pas dans ton code, pour rappel un héritage c'est comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MaClasse : public ClasseHéritée
    {
    // Implémentation de la classe...
    };
    Autre chose qui me chiffonne, dans ton fichier.h je vois deux fonctions virtuelles, mais s'il n'y a pas d'héritage, la virtualité ne sert donc à rien, et il est même possible que cela provoque des erreurs.

    Pour ce qui est de ton erreur, montre nous le code du fichier my_class_ptrhead.h

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Salut,

    Merci pour ta réponse.
    Je prends note pour les ; et les : :
    je vais donner ce qui aurait dû être déjà là, je pense que je me suis planté quand j'ai fait le copier coller
    je re — colle sans modification, afin de pas ce retrouver avec quelque chose d'autre.

    dans l'ordre: fichier *.h , fichier *.cpp fichier main.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
    29
    30
    31
    32
    33
    34
    #ifndef DEF_PTREAD
    #define DEF_PTREAD
     
    #include <pthread.h>
    class c_thread
    {
    	public:
    				/*constructeur*/
    				c_thread();
    				/*destructeur*/
    				~c_thread();
    				/* methode*/
    				/*creation du thread*/
    				int m_thread_create();/*1 -->static void m_thread_call();*/
    				/*atribut*/
    	protected:
    				virtual void m_call_thread(){};/*3 --> ok*/
    	private:
    				/*methode privée*/
    				static void *m_thread_call(void *this_); /*2 --->[protect virtual m_call_thread]*/
    				/*obtenir le handle cree precedament*/
    				int get_handle();
    				/*attribut priver*/
    				pthread_t handle_;
    };
    class B{
    	public:c_thread
    	virtual void m_call_thread()
    	{
    		std::cout << "thread started" << std::endl;
    	};
    };
     
    #endif //fin des macro
    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
    #include "my_class_ptrhead.h"
     
    /*constructeur*/
    c_thread::c_thread() {};
    /*destructeur*/
    c_thread::~c_thread(){};
    /*creation du thread et renvoi du handle*/
    int c_thread::m_thread_create()
    {
    		pthread_create(&handle_, 0, c_thread::m_thread_call, static_cast<void *>(this));
    		return c_thread::get_handle() ;
    };
     
    /*obtenir le handle cree precedament*/
    int c_thread::get_handle() 
    {
    		return handle_;
    };
     
    void *c_thread::m_thread_call (void *data){
    	c_thread *base = static_cast<c_thread *>(data);
    	base->m_call_thread();
    	return 0;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
    	c_thread thread_p;
    	int id1_H = 0;
    	id1_H = thread_p.m_thread_create();
    	std::cout << id1_H << std::endl;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rreur:
    In file included from my_class_ptrhead.cpp:1,
                     from main.cpp:5:
    my_class_ptrhead.h:28: erreur: two or more data types in declaration of ‘m_call_thread’

  4. #4
    Membre averti Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Points : 343
    Points
    343
    Par défaut
    Soit j'suis bigleux, soit y'a toujours pas le fichier my_class_ptrhead.h

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par Dalini71 Voir le message
    Soit j'suis bigleux, soit y'a toujours pas le fichier my_class_ptrhead.h
    si il est là dans le premier code : d'ailleurs l'importe

    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
    35
     
    #ifndef DEF_PTREAD
    #define DEF_PTREAD
     
    #include <pthread.h>
    class c_thread
    {
    	public:
    				/*constructeur*/
    				c_thread();
    				/*destructeur*/
    				~c_thread();
    				/* methode*/
    				/*creation du thread*/
    				int m_thread_create();/*1 -->static void m_thread_call();*/
    				/*atribut*/
    	protected:
    				virtual void m_call_thread(){};/*3 --> ok*/
    	private:
    				/*methode privée*/
    				static void *m_thread_call(void *this_); /*2 --->[protect virtual m_call_thread]*/
    				/*obtenir le handle cree precedament*/
    				int get_handle();
    				/*attribut priver*/
    				pthread_t handle_;
    };
    class B{
    	public:c_thread
    	virtual void m_call_thread()
    	{
    		std::cout << "thread started" << std::endl;
    	};
    };
     
    #endif //fin des macro

  6. #6
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Je n'ai pas tout regardé.
    Le plus gros prob c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B{ // { <----- mal placé!!!
      public:c_thread // <---- big probo!!
      virtual void m_call_thread()
      // ...
    A part ça, le destucteur de c_thread devrait être virtuel parce que c_thread contient des membres virtuels (et que B derive de c_thread)

    my_class_ptrhead.h <-- c'est pour "Pointer Head" ou c'est un typo que tu trimbales ?

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par metagoto Voir le message
    Je n'ai pas tout regardé.
    Le plus gros prob c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B{ // { <----- mal placé!!!
      public:c_thread // <---- big probo!!
      virtual void m_call_thread()
      // ...
    A part ça, le destucteur de c_thread devrait être virtuel parce que c_thread contient des membres virtuels (et que B derive de c_thread)

    my_class_ptrhead.h <-- c'est pour "Pointer Head" ou c'est un typo que tu trimbales ?
    J'ai l'impression que tu t'insurge ici principalement contre la "mise en forme du code...

    Et pourtant, il un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class B:public A{private:T type; public: B();virtual ~B();Type2 fonction(); };
    sera tout à fait valide

    Il manque certes de lisibilité, mais c'est un code tout à fait légal (admis par le langage), étant donné que les tabulations, les espaces et les retours à la ligne ne sont absolument pas pris en compte dés qu'il en existe au moins un entre deux termes distincts
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Regarde à nouveau la partie de code que j'ai mentionné. Ce n' est pas du c++ valide. La mise en forme n'a rien à voir, si ce n'est induire un peu plus en erreur.

Discussions similaires

  1. Problème d'héritage classe dérivée
    Par Papipone dans le forum Débuter
    Réponses: 5
    Dernier message: 07/07/2015, 10h37
  2. Problème d'héritage classes et interfaces
    Par touftouf57 dans le forum C#
    Réponses: 3
    Dernier message: 18/04/2011, 14h38
  3. Réponses: 11
    Dernier message: 11/03/2011, 10h36
  4. [Débutant] [POO] Problème d'héritage
    Par fire.stone dans le forum Langage
    Réponses: 3
    Dernier message: 30/09/2006, 23h21
  5. Réponses: 2
    Dernier message: 25/07/2004, 23h24

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