Не удается установить местоположение указателя на местоположение другого указателя в C

#c #pointers #reference

#c #указатели #ссылка

Вопрос:

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

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

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

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

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

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

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

Комментарии:

1. Первое выглядит в самый раз.

2. Вы получаете ошибку компилятора или указатель, измененный внутри функции, не отражается снаружи? т. Е. можете ли вы уточнить, в чем ошибка?

Ответ №1:

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

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

typedef std::string CanvasElement;

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

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

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

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

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

 CanvasElement* lastFocusedCanvasElement(std::vector<CanvasElement*>amp; elements)
  

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

Комментарии:

1. Верно, я согласен с последним комментарием. Я думаю, что лучшим вариантом является возврат указателя, а не передача аргумента по ссылке.

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

Ответ №2:

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