Невозможно установить местоположение указателя на местоположение другого указателя в C ++ - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть метод, который принимает ссылку на вектор, который содержит указатели на объекты в качестве первого параметра, и ссылку на указатель на объект того же типа, что и второй параметр.В методе я хочу изменить местоположение, на которое ссылается второй аргумент, на объект в векторе.Затем вызывающий метод должен использовать измененный указатель, имея новое местоположение в качестве цели.Однако мои текущие попытки реализовать это терпят неудачу.

Рассматриваемый метод:

void execute(std::vector<CanvasElement*>& elements,CanvasElement*& lastFocused)

Примеры способов, которые я безуспешно пытался установить значение, на которое указывает lastFocused:

lastFocused = elements[0];
*lastFocused = *elements[0];

Уточнение в ответ на комментарий ниже: ошибка в том, что изменения внутри функции не отражаются ни разу за рамками этой функции.

Я могу подтвердить, напечатав адреса, хранящиеся вкаждый указатель во время выполнения приложения указывает, что значение действительно устанавливается в пределах выполнения, но за пределами выполнения оно не изменялось.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Задание lastFocused = elements[0]; должно работать, вот демонстрация:

#include <iostream>
#include <string>
#include <vector>

typedef std::string CanvasElement;

void execute(std::vector<CanvasElement*>& elements, CanvasElement*& lastFocused)
{
    lastFocused = elements[0];
}

int main()
{
    std::string a = "hello";
    std::string b = "world";

    std::vector<std::string*> vec;
    vec.push_back(&a);
    vec.push_back(&b);

    std::string* p = 0;
    execute(vec, p);
    if (p == &a)
    {
        std::cout << "It worked :-)\n";
    }
    else
    {
        std::cout << "It did not work :-(\n";
    }
}

Кстати, есть люди, которые утверждают, что следующая подпись будет лучше:

CanvasElement* lastFocusedCanvasElement(std::vector<CanvasElement*>& elements)

То есть вы должны возвращать значение указателя вместо изменения переменной указателя.

0 голосов
/ 26 апреля 2011

Мне удалось решить эту проблему, сохранив ссылку на указатель в векторе и обновив эту сохраненную ссылку. Я не знаю, почему установка его напрямую не сработала, но этот хак сделал свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...