Присвоение значений указателям в C ++ - PullRequest
2 голосов
/ 01 октября 2010

Это фрагмент кода, который я использую:

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, чтобы убедиться, что я могу постоянно (по сравнению с локально) изменять предоставленный указатель.

Ответы [ 2 ]

1 голос
/ 01 октября 2010

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

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

0 голосов
/ 01 октября 2010

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...