2010-10-01 3 views
2

Это фрагмент кода, я использую:Присвоение значений указателей в 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); 
} 

Если list является NULL, новый Location должен быть создан и указатель list должен указывать, что новое место. Это поведение, которое я ожидаю от этого кода, но перед тем как gdb завершит эту функцию, я заметил, что list по-прежнему NULL. Что я здесь делаю неправильно?

Я использовал амперсанд в Location* &list, чтобы убедиться, что я могу навсегда (по сравнению с локально) изменить поставляемый указатель.

+4

Лично я бы не использовал указатель. Вы представляете пустой список как указатель NULL. Это означает, что вам нужно добавить код, чтобы явно проверить это везде в вашем коде. Создайте объект (который изначально представляет пустой список), а затем просто добавьте к нему членов, не требуя специального случая. –

+1

Ваш код должен работать, вы отключили оптимизацию при отладке? –

+0

Я не уверен, знаю ли вы, что вы там говорите, Винсент. Я использую gdb внутри Eclipse с настройками по умолчанию. Я нахожусь в Windows, и я использую компилятор MinGW C++. – Pieter

ответ

0

Лично я бы не использовал указатель.

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

Выглядит намного проще для реализации, но, как я уже упоминал в другом комментарии, я делаю школьный проект на C++, и мы едва ли применили некоторые преимущества на C++. Мне не разрешено использовать материал, который мы не рассматривали в проекте, поэтому на данный момент я думаю, что я должен придерживаться альтернативы C для создания динамически связанных списков. – Pieter

+0

@Pieter - вам не разрешается использовать STL и т. Д., Но вам все равно не нужно делать это с модой C, с управлением памятью грубой силы с помощью новых/delete/malloc/free и raw указателей во всем мире. –

1

Давайте не будем изобретать колесо здесь ... Know your libraries.

Если вы используете список STL контейнер (или любой другой контейнер), то вам не нужно беспокоиться о нулевых указателей.

+0

Я делаю это для школьного проекта, и мы пока не рассматривали списки на нашем курсе C++, поэтому, к сожалению, мне не разрешено использовать их. – Pieter

Смежные вопросы