A propos les listes Chaînées C++

Fermé
paras00 Messages postés 11 Date d'inscription samedi 12 décembre 2009 Statut Membre Dernière intervention 19 mai 2010 - 7 févr. 2010 à 20:24
paras00 Messages postés 11 Date d'inscription samedi 12 décembre 2009 Statut Membre Dernière intervention 19 mai 2010 - 7 févr. 2010 à 20:56
Bonjour,

j'aimerai bien que vous m'aidez à resoudre une erreur dans mon programme

Code C/C++ :

#include <iostream.h>
typedef void* T ;
class element
{
    friend class liste;
    T valeur;
    element *next;
    element(int a)
    {valeur=(T)a;next=NULL;}
};
class liste
{
  T courant;
  public :
    liste :: liste( const liste & uneListe )
{
  * this = uneListe;
}
    liste(){courant=NULL;}
	int vide ();
	void initialiser ();
	void ajouter (T);
    int longuer();
    void afficher();
};
int liste::vide()
{
    if(courant==NULL)
    return 1;
    else return 0;
}
void liste::initialiser()
{
    if(!vide())
	{
        courant = NULL;
	}
}
void liste::ajouter(T v)
{
	void* tmp=courant;
    void* nouveau = new T(v);
    ((*nouveau)->valeur) = v;
    nouveau->next = NULL;
    if(vide()) courant = nouveau;
	else
	{
		tmp = courant;
        while(tmp->next != NULL) tmp = tmp->next;
        tmp->next = nouveau;
    }
}

void liste::afficher()
{
	void* tmp;
    if(vide()) cout<<"                  !la liste est vide!\n";
    else
	{
		tmp = courant;
        while(tmp != NULL)
		{
			cout<<((tmp)->valeur)<<" ";
            tmp = tmp->next;
        }
        cout<<"   - longueur : "<<longuer()<<endl;
     }
}
int liste::longuer()
{
	int l=0;
    void* tmp = courant;
    while(tmp != NULL)
	{
		l++;
        tmp = tmp->next;
    }
    return l;
}

int main ()
{
	liste * L = new liste();
	int choix;
	int v;
	do
	{
      cout<<"1-Nouvelle Liste.\n";
      cout<<"2-Ajouter Element.\n";
      cout<<"6-Afficher.\n";
      cout<<"0-Quitter.\n";
	  cout<<"   -->choix(0-6):";	  cin>>choix;
      switch(choix)
	  {
		  case 1:
			  L->initialiser();
              break;
		  case 2:
			  cout<<" - Entrer une valeur : "; cin>>v;
			  L->ajouter((T)v);
              break;

         case 6:
			  L->afficher();
			  break;
 }
    
	}while(choix != 0);
	return 0;

}






Il me donne comme erreur :

C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\backward\backward_warning.h|32|warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated header . To disable this warning use -Wno-deprecated.|
C:\Documents and Settings\user\Bureau\lis.cpp||In member function `void liste::ajouter(void*)':|
C:\Documents and Settings\user\Bureau\lis.cpp|46|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|47|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|52|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|52|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|53|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|123|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|124|error: `void*' is not a pointer-to-object type|
C:\Documents and Settings\user\Bureau\lis.cpp|136|error: `void*' is not a pointer-to-object type|
||=== Build finished: 6 errors, 1 warnings ===|



C'est suppeeeeer urgent

Et Merci d'avance

5 réponses

paras00 Messages postés 11 Date d'inscription samedi 12 décembre 2009 Statut Membre Dernière intervention 19 mai 2010
7 févr. 2010 à 20:26
Pouvez-vous m'aider à résoudre cette erreur
"`void*' is not a pointer-to-object type"

et MERCIIIIIII.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
7 févr. 2010 à 20:34
alors :

pour le warning : #warning This file includes at least one deprecated or antiquated header.

<iostream.h> n'est pas le bon header à utiliser, c'est <iostream> .

pour les erreurs :

LE C (Et le C++) ont besoin de savoir le type d'objet pointé pour pourvoir faire des appels dessus :

(tmp)->valeur par exemple n'est pas valable, car tmp est un pointeur void* (donc un pointeur qui ne contient aucune information sur le type d'objet pointé ). Il n'y a donc pas la possibilité de regarder "valeur", car "valeur" est défini dans une classe, inconnue du compilateur lorsque tu fais ça.


cette ligne n'a particulièrement aucun sens :

void* nouveau = new T(v)

comment instancier sans classe ?


solution : il faut que tu te décides à choisir un type. Sinon, tu peux jeter un coup d'oeil du coté des "templates" (modèles) pour faire une classe de liste qui pourrait accepter au choix un certain type. Tu peux aussi "caster" (convertir) tes pointeurs, mais encore une fois il faut trouver un moyen de savoir vers quel type d'objet pointent tes pointeurs.
0
paras00 Messages postés 11 Date d'inscription samedi 12 décembre 2009 Statut Membre Dernière intervention 19 mai 2010
7 févr. 2010 à 20:46
alors sans les templates sa ne peut pas etre resolu??
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
7 févr. 2010 à 20:50
ce serait possible si tu ne manipulais QUE des pointeurs, sans jamais chercher à faire p->quelquechose sur le p qui sont de type void* .

Et ensuite, dans ton main, tu crées ta liste (de ponteurs !) qui t'intéressent. Tu fais en sorte que toutes les fonctions ne renvoient et ne reçoivent que des pointeurs void*, et dans ton main lorsque tu veux utiliser un des pointeurs reçus par tes diverses fonction tu n'as qu'à faire par exemple : ((monType*) pointeur)->fonctionDeLaClasseMonType()
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
paras00 Messages postés 11 Date d'inscription samedi 12 décembre 2009 Statut Membre Dernière intervention 19 mai 2010
7 févr. 2010 à 20:56
Ah ok

Merci bien je vais esseyer.

Merci
0