#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:
Я смог решить эту проблему, сохранив ссылку на указатель в векторе и обновив эту сохраненную ссылку. Я не знаю, почему установка его напрямую не сработала, но этот взлом выполнил свою работу.