Bonjour à tous,

Je vous explique un peu ce que je fais avant d'expliquer ce qui ne vas pas.

Je dois creer deux classes, l'une pouvant stocker des "char" dans un tableau et pouvant pointer sur un objet du meme type de cette classe, appelons la Element, et une autre classe (on l'appelera lista) regroupant des Elements (l'objet). C'est donc une liste d' Elements. Le but final est de pouvoir lire un fichier avec des caracteres, de stocker chaque ligne dans un object Element (donc de mettre tous les symboles dans le tableau) et faire pointer le 1er objet vers le second, et le second vers le 3eme, etc.

Un objet de Lista representera donc, de maniere dérivée, toutes les lignes du fichiers.

Bon j'espere que vous avez compris, je vous montre le programme maintenant:


lista.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
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
 
#include <cstdlib>
#include <iostream>
#include <new>
 
 
using namespace std;
extern int size_table ;
 
class Element {         
      char *Table;
      int Dimension;
      Element *next ;
 
public :
 
#include <cstdlib>
#include <iostream>
#include <new>
 
 
using namespace std;
extern int size_table ;
 
class Element {         
      char *Table;
      int Dimension;
      Element *next ;
 
public :
 
       //  Constructeur
       Element(int=3);
 
       //  Destructeur
       ~Element();
 
       //  Constructeur de copie
       Element(const Element&);
 
       // permet d'initialiser le tableau d'un objet element (c'etait une fonction juste pour tester)
       void setElement(int,int);
 
       // permet d'acceder au pointeur next d'element depuis l'exterieur
       Element * return_next() { return next;}
 
       // Servira pour la lecture du fichier et l'ecriture egalement
       Element & operator=(char *) const;
       char* & operator=(const Element&) const;        
 
 
       // Affiche le contenu d'un objet Element
       friend  ostream &operator<<(ostream& o, Element&);
};
 
class Lista : public Element {         
      Element *Work;
 
public :
       // Constructeur
       Lista();
 
        //  Destructeur
       ~Lista();
 
       // Constructeur par copie
       Lista(const Lista&);  
 
};
lista.ccp
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
 
#include "Lista.h"
 
// Constructeur 
Element::Element(int a) {
    Table = new char[Dimension=a];
   	for (int i=0;i<Dimension;i++) {
		Table[i]=0;
	}
	next = NULL ;
}
 
// Constructeur par copie 
Element::Element(const Element & Elementcopy) {
       Dimension =Elementcopy.Dimension;
       Table= new (nothrow) char[Dimension];
 
       for(int i=0; i<Dimension; i++) {
             Table[i]= Elementcopy.Table[i] ;
       }
       next = Elementcopy.next ;
} 
 
// Servira a la lecture du fichier
Element & Element::operator=(char *Table_char) const {
        Element M(size_table);
        for(int i=0; i<M.Dimension; i++) {
                M.Table[i]=Table_char[i] ;
        }
        return M;        
}
 
// Servira a l'ecriture du fichier
char * & Element::operator=(const Element &M) const {
       char * return_Table = new char[M.Dimension];
       for(int i=0; i<M.Dimension; i++) {
                return_Table[i]=M.Table[i] ;
       }
       return return_Table;
}
 
// Destructeur
  Element::~Element() {
       delete[] Table; 
}
 
// Accede au contenu d'un object Element
 void  Element::setElement(int indice,int valeur) {
	Table[indice]=valeur;
 }
 
// Affiche un objet Element
  ostream & operator<<(ostream& o, Element &M) {
          int i;
 
          for(i=0; i<M.Dimension; i++){
                   o<<"\t";
                   o<<M.Table[i]<<"\t";
                   o<<endl;
          }
 
          o<<endl;   
          return o;
}
 
// Constructeur de lista     
Lista::Lista() {
    Work = NULL ;
}
 
// Constructeur par copie 
Lista::Lista(const Lista & Listacopy) {
    if (Listacopy.Work == NULL) cout << "Nothing to copy" << endl ;
    else {             
         Element *suivant;
         Work = Listacopy.Work;         
         suivant = (Listacopy.Work)->return_next();        
         while (suivant!= NULL) {
               Work = Work->return_next();
               Work = suivant;
               suivant = suivant->return_next();            
         }
 
    }
}    
 
// Destructeur par copie 
Lista::~Lista() {
       Element *n;
       Element *Suiv;       
       n = Work;
       while (n!= NULL) {
             Suiv = n->return_next();
             delete[] n; 
             n=Suiv;           
       }
 
       delete[] n; 
}
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
 
#include "Lista.h"
 
int size_table=0 ;
 
int main(int argc, char *argv[]) {
	Element M(4);   // Creation d'un Element
	Element Aut(2); // Creation autre Element
	Aut.setElement(0,6); // Initialisation
	Aut.setElement(1,6);
    M.return_next() =  &Aut ;  // Je veux faire pointer M.return_next() vers l'Element Aut
	if (M.return_next()==NULL) cout << "Marche Pas" <<endl ;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}

Ok donc dans mon main, je voulais tester si ce que j'avais fais avant marchait donc j'ai creé deux objets Element, de dimension differente et je voulais faire pointer le voisin de M (qui est next) vers A.
Si je ne m'abuse, M->next étant un pointeur, je peux faire "pointer" ce pointeur vers l'Element Aut en utilisant la syntaxe :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
M.return_next() =  &Aut ;

Cependant j'obtiens une erreur de compilation du genre "non lvalue in assignement". Je comprend ce que ce message signifie mais je comprend absolument pourquoi je l'obtiens.

En esperant avoir été clair, je vous remercie de vos réponses!

PS: je rappelle que j'étais en train de tester le programme donc si vous voyez des erreurs que j'aurais faites dans les autres parties, c'est normal que je ne les ai pas encore vues (mais bon si vous en voyez, merci de me les signaler)

Nico