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 :

-Debutant-Connaitre le typage d'un objet


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut -Debutant-Connaitre le typage d'un objet
    Bonjour

    Les vacances commençant j'ai décidé d'apprendre le c++. Ayant étudié le model objet en cours sur du Java.

    Je suis entrain d'écrire une liste doublement chainée et j'aimerais pouvoir concatener une premiere liste à une seconde mais à la seule condition que leur type soit identique.

    Seulement ma classe ListeDoublementChainée est générique et ne possède donc pas de type definit.

    Je n'arrive donc pas à savoir qu'elle est le protoype de ma fonction afin qu'elle prennent la seconde liste en parametre et qu'elle renvoye un pointeur de type T qui serait la concatenation de la liste 1 et 2. J'avoue ne pas savoir si il existe une classe primitive comme Objet en java, dont toutes les classes C++ dépendent, ni comment remplacer le instance of pour decouvrir si les deux types sont identiques.

    Si quelqu'un voulait bien m'expliquer ou me donner un lien ou je pourrais trouver la réponse, je le lui en serais grè.

  2. #2
    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
    Il faut oublier les Object et compagnie, typiquement là il te faut utiliser les templates.

  3. #3
    Membre confirmé
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Par défaut
    Salut
    Comme toi j'ai décidé t'apprendre le C++
    voiçi un site simple pour débutant
    ça te paraîtrait peutêtre simple
    mais autant il ya les réponses à tes questions.

  4. #4
    Membre confirmé
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Par défaut
    oops j'ai publié de te mettre le lien
    http://www.ann.jussieu.fr/courscpp/index.html
    voila

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut merci
    Je vais me plonger dedans

    Juste avant, j'ai finit ma liste doublement chainée mais voila jai des erreurs de compilation et même si je comprend le sens, je ne comprend pas comment resoudre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef LISTEDOUBLEMENTCHAINEE
    #define LISTEDOUBLEMENTCHAINEE
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <string.h>
     
    #endif


    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    #include "ListeDoublementChainee.h"
    #include <iostream>
     
     
     
     
    template <class T> class ListeDoublementChainee {
     
    private : 
    	struct noeud{
    		T  element ;
    		int indice ;
    		struct noeud* previous;
    		struct noeud* next ; 		
     
     
    	};
    	typedef struct noeud noeud ;
     
    	int nbElement ;
    	noeud* racine  ; //point toujours sur le premier
    	noeud* pre ; //pre sera toujours sur le dernier élement de la liste
    	noeud* current ; //permet de se déplacer
     
    public : 
    	//constructeur
    	ListeDoublementChainee(){
    		racine = NULL ;
    		pre = NULL ;
    		nbElement = 0 ;
    	};
     
     
    //accesseur 	
    	//recuprer un element
    	T getNoeud(int i){
    		noeud* p = racine ;
    		if (i > nbElement) return NULL ;
    		for (int j = 0 ; j != i ; j++){
    			p = p->next ;
    		}
    		return p->element ;
    	};
     
    	//connaitre le nbElement
    	int getNbElement(){
    		return nbElement ;
    	};
     
    	//recuperer la racine
    	noeud getRacine(){
    		return *racine ;
    	};
     
    	//recupere l'element courrant
    	noeud getCurrent(){
    		 return *current ;
    	};
     
    	//recupere l'element courrant
    	T getCurrentNoeud(){
    		return current->element ;
    	};
     
     
    //modificateur	
    	//ajouter un element
    	void putNoeud(T obj){
    		noeud *p = new noeud ;
    		p->element = obj ;
    		p->indice = nbElement ;
    		p->previous = pre ;
    		p->next = NULL ;
     
    		if (nbElement == 0) {
    			racine = p ;
    			pre = racine ;
    			current = racine ; 
    		}else{ 
    			pre->next = p ;
    			pre = p ;
    		}
    		nbElement ++ ;
    	};	
     
    	//supprimer un element
    	int delNoeud(int i){
    		noeud* p = racine ;
    		noeud* avant = NULL ;
    		noeud* apres = NULL ;
     
    		if (i > nbElement) return -1 ;
     
    		for (int j = 0 ; j != i ; j++){
    			avant = p ;
    			p = p->next ;
    			apres = p->next ;
    		}
     
    		delete p ;
    		avant->next = apres ;
     
    		if (apres != NULL) 
    		      apres->previous = avant ;
     
     
    		while (apres != NULL){
    			apres->indice -- ;
    			apres = apres->next ;
    		}
     
    		nbElement -- ;
    		return 1 ;
    	};
     
     
     
    //methode	
    	//concatener deux chaines pour en obtenir une troisieme
    	void concacList(T L){
    		pre->next = L.getRacine();
    		noeud *p = pre->next ;
    		p->previous = pre ;
     
    		//pour placer pre à la fin 
    		for (int j = 1 ; pre->next != NULL; j++){
    			pre = pre->next ;
    			pre->indice = nbElement + j ; 
    		}
    		this.nbElement += L.getNbElement();
    	};
     
    	//pour deplacer le curseur de l'element courant
    	int moveList(int i , char lr){
    		switch(lr){
    			case 'l' : if ((i - current->indice) < 0) return -1 ;
    			else {
    				for (int j = 0 ; j < i ; j++) 
    					current = current->previous ;	
    			}
    			break ;
     
    			case 'r' : if((i + current->indice) > (nbElement-1)) return -1 ;
    			else {
    				for (int j = 0 ; j < i ; j++) 
    					current = current->next ;
    			}
    			break ;
     
    			default : return -1 ;
    		}
    		return 1 ;
    	};
     
    	void afficheToi(){
    		noeud* p = racine ;
    		for (int i = 0 ; i < nbElement ; i++){
    			ListeDoublementChainee::cout<<"Element : "<<p->element<<ListeDoublementChainee::endl;
    			p = p->next ;   
    		}
    	};
     
    	//destructeur
    	~ListeDoublementChainee (){};
    };
     
     
    int main (int argc, char* argv[]){
     
    	printf("Bench de la liste chaînée  \n");
    	cout<<"Creation des variables"<<endl ;
     
    	ListeDoublementChainee<int>l1();
    	ListeDoublementChainee<int>l2();
    	l1.putNoeud(1);
    	l1.putNoeud(2);
    	l1.putNoeud(3);
    	l1.afficheToi();
    	l2.putNoeud(4);
    	l2.putNoeud(5);
    	l2.putNoeud(6);
    	l2.afficheToi();	
     
     
     
    	return 0 ;
    }

    Log de compilation :
    [Zeft@localhost Moteur 2D]$ gcc -o test.out ListeDoublementChainee.cpp
    ListeDoublementChainee.cpp: In function ‘int main(int, char**)’:
    ListeDoublementChainee.cpp:169: erreur: ‘cout’ was not declared in this scope
    ListeDoublementChainee.cpp:169: erreur: ‘endl’ was not declared in this scope
    ListeDoublementChainee.cpp:173: erreur: request for member ‘putNoeud’ in ‘l1’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:174: erreur: request for member ‘putNoeud’ in ‘l1’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:175: erreur: request for member ‘putNoeud’ in ‘l1’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:176: erreur: request for member ‘afficheToi’ in ‘l1’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:177: erreur: request for member ‘putNoeud’ in ‘l2’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:178: erreur: request for member ‘putNoeud’ in ‘l2’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:179: erreur: request for member ‘putNoeud’ in ‘l2’, which is of non-class type ‘ListeDoublementChainee<int> ()()’
    ListeDoublementChainee.cpp:180: erreur: request for member ‘afficheToi’ in ‘l2’, which is of non-class type ‘ListeDoublementChainee<int> ()()’

    J'avoue que l'erreur que je comprend le moins, est l'erreur sur le cout et le endl. Je pensais que c'était une maccro définit dans le iostream (dont d'ailleurs je me suis fais jeter quand je lui ai mis un .h a la fin) mais je comprend pas ce qu'il fait faire pour l'utiliser (et mon aide mémoire c/c++ de dunod m'aide pas beaucoup).

  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
    Pour cout et endl (qui sont loin d'être des macros) :
    http://c.developpez.com/faq/cpp/?pag...L_cout_inconnu

    Pour les autres erreurs :
    http://c.developpez.com/faq/cpp/?pag..._list_list_fct

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Par défaut
    Merci beaucoup. Je me posais la question pour le iosteam pourquoi ne possède t'il pas de .h à la fin de son nom.

    Par contre j'aimerais savoir : est ce que le namespace est la solution lorsque l'on a un héritage mutiple avec des grands parents qui ont une fonction commune et dont on voudrait user la fonction de seulement l'un d'entre eux ?

    Ah et aussi, je dois pas être doué mais la ligne de compilation c'est bien : gcc -o a.out fichier.cpp

    car je me retrouve avec cette superbe erreur :

    [Zeft@localhost Moteur 2D]$ gcc -o test.out ListeDoublementChainee.cpp
    /tmp/ccUeddZ0.o(.text+0x36): In function `main':
    ListeDoublementChainee.cpp: undefined reference to `std::cout'
    /tmp/ccUeddZ0.o(.text+0x3b):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
    /tmp/ccUeddZ0.o(.text+0x46):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
    /tmp/ccUeddZ0.o(.text+0x4c):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
    /tmp/ccUeddZ0.o(.text+0x16d): In function `__tcf_0':
    ListeDoublementChainee.cpp: undefined reference to `std::ios_base::Init::~Init()'
    /tmp/ccUeddZ0.o(.text+0x19a): In function `__static_initialization_and_destruction_0(int, int)':
    ListeDoublementChainee.cpp: undefined reference to `std::ios_base::Init::Init()'
    /tmp/ccUeddZ0.o(.gnu.linkonce.t._ZN22ListeDoublementChaineeIiE8putNoeudEi[ListeDoublementChainee<int>::putNoeud(int)]+0xc): In function `ListeDoublementChainee<int>::putNoeud(int)':
    ListeDoublementChainee.cpp: undefined reference to `operator new(unsigned int)'
    /tmp/ccUeddZ0.o(.gnu.linkonce.t._ZN22ListeDoublementChaineeIiE10afficheToiEv[ListeDoublementChainee<int>::afficheToi()]+0x27): In function `ListeDoublementChainee<int>::afficheToi()':
    ListeDoublementChainee.cpp: undefined reference to `std::cout'
    /tmp/ccUeddZ0.o(.gnu.linkonce.t._ZN22ListeDoublementChaineeIiE10afficheToiEv[ListeDoublementChainee<int>::afficheToi()]+0x2c):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
    /tmp/ccUeddZ0.o(.gnu.linkonce.t._ZN22ListeDoublementChaineeIiE10afficheToiEv[ListeDoublementChainee<int>::afficheToi()]+0x39):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
    /tmp/ccUeddZ0.o(.gnu.linkonce.t._ZN22ListeDoublementChaineeIiE10afficheToiEv[ListeDoublementChainee<int>::afficheToi()]+0x44):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
    /tmp/ccUeddZ0.o(.gnu.linkonce.t._ZN22ListeDoublementChaineeIiE10afficheToiEv[ListeDoublementChainee<int>::afficheToi()]+0x4a):ListeDoublementChainee.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
    /tmp/ccUeddZ0.o(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
    collect2: ld a retourné 1 code d'état d'exécution
    [Zeft@localhost Moteur 2D]$

    Merci beaucoup

  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
    Merci beaucoup. Je me posais la question pour le iosteam pourquoi ne possède t'il pas de .h à la fin de son nom.
    C'est dans la FAQ aussi, juste à côté de la QR que je t'ai donnée précédemment.

    Par contre j'aimerais savoir : est ce que le namespace est la solution lorsque l'on a un héritage mutiple avec des grands parents qui ont une fonction commune et dont on voudrait user la fonction de seulement l'un d'entre eux ?
    Non. Pour cela il te faudra bien utiliser l'opérateur de résolution de portée (:, mais avec le nom de la classe concernée et non un namespace.

    Ah et aussi, je dois pas être doué mais la ligne de compilation c'est bien : gcc -o a.out fichier.cpp
    g++, pas gcc.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par zakalova
    Comme toi j'ai décidé t'apprendre le C++
    voiçi un site simple pour débutant
    ça te paraîtrait peutêtre simple
    mais autant il ya les réponses à tes questions.
    http://www.ann.jussieu.fr/courscpp/index.html
    voila
    ... Je me disais bien qu'il y avait des constructions moyennes dans ce cours... il vise TurboC++ et doit probablement dater de cette époque.
    Trop vieux, à oublier. Cela ne t'aidera probablement pas avec les templates, les espaces de noms, la SL, ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je suis entrain d'écrire une liste doublement chainée
    Elles existent déjà en standard, regarde comment elles sont implementées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant][ArrayList]parcours et recherche d'objets
    Par codexomega dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/02/2006, 18h14
  2. [Débutant][Conception] Mettre à jour un objet de type classe
    Par Sylvester dans le forum Général Java
    Réponses: 19
    Dernier message: 09/02/2006, 17h59
  3. Connaitre l'ID d'un objet
    Par srvremi dans le forum MFC
    Réponses: 1
    Dernier message: 07/11/2005, 23h37
  4. [Débutant(e)][Conception] prob de programmation objet
    Par gregorian dans le forum Général Java
    Réponses: 3
    Dernier message: 07/07/2005, 11h20
  5. [DEBUTANT] Conseil sur la programmation orienté objet
    Par etiennegaloup dans le forum Langage
    Réponses: 7
    Dernier message: 27/05/2005, 12h59

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