2010-10-01 6 views
2

C'est un extrait de code que j'utilise:Attribution de valeurs aux pointeurs en C++

void Move::AddToMovesList(Location* &list, int row, int col) { 
    // If the list is empty, create the first item 
    if (list == NULL) 
     list = new Location(row, col); 
    // List exists, so append 
    else 
     list->Add(row, col); 
} 

Si list est NULL, une nouvelle Location devrait être créé et le pointeur list doit pointer vers ce nouvel emplacement. C'est le comportement que j'attendrais de ce code, mais juste avant que gdb ne quitte cette fonction, j'ai remarqué que list est toujours NULL. Qu'est-ce que je fais mal ici?

J'ai utilisé l'esperluette dans Location* &list pour vous assurer que je peux en permanence (par rapport au niveau local) changer le pointeur fourni.

+4

Personnellement, je n'utiliserais pas de pointeur. Vous représentez la liste vide en tant que pointeur NULL. Cela signifie que vous devez ajouter du code pour le vérifier explicitement partout dans votre code. Créez un objet (qui représente initialement la liste vide) puis ajoutez simplement des membres sans qu'aucun cas particulier ne soit requis. –

+1

Votre code devrait fonctionner, avez-vous désactivé les optimisations lors du débogage? –

+0

Je ne sais pas si je sais de quoi vous parlez, Vincent. J'utilise gdb dans Eclipse avec les paramètres par défaut. Je suis sur Windows et j'utilise le compilateur MinGW C++. – Pieter

Répondre

0

Personnellement, je n'utiliserais pas de pointeur du tout.

class Location 
{ 
    public: 
     void add(int row, int col) 
     { 
      data.push_back(std::make_pair(row,col)); 
     } 
     bool isEmpty() const {return data.empty(); } 
    private: 
     std::vector<std::pair<int,int> > data; 
}; 


class Move 
{ 
    public: 
     // Pass a reference to the list. 
     // No special case processing if the list is empty. 
     // No problems with ownership. 
     // No problems with lifespan associated with new/delete 
     void addToMoveList(Location& list, int row, int col) 
     { 
      list.add(row, col); 
     } 
}; 

int main() 
{ 
    Location list; // Don't use new if you can declare a local variable. 
    Move  move; 

    move.addToMoveList(list, 10, 2); 
} 
+0

Cela semble beaucoup plus facile à mettre en œuvre, mais comme je l'ai mentionné dans un autre commentaire, je suis en train de faire un projet d'école sur C++ et nous avons à peine couvert les avantages spécifiques au C++. Je ne suis pas autorisé à utiliser des choses que nous n'avons pas couvertes dans le projet, donc pour l'instant je pense que je dois m'en tenir à l'alternative C de créer des listes liées dynamiquement. – Pieter

+0

@Pieter - vous ne pouvez pas être autorisé à utiliser STL etc, mais vous n'avez pas besoin de le faire en mode C, avec une gestion de la force brute via new/delete/malloc/free et raw partout. –

1

Let réinventons pas la roue ici ... Know your libraries.

Si vous utilisez le conteneur de liste STL (ou tout autre récipient) vous n'avez pas besoin de se soucier des pointeurs nuls.

+0

Je le fais pour un projet d'école et nous n'avons pas couvert les listes dans notre cours de C++ jusqu'ici, donc malheureusement je ne suis pas autorisé à les utiliser. – Pieter

Questions connexes