我有一个方法,它引用一个向量,该向量包含指向对象的指针作为第一个参数,以及对指向与第二个参数相同类型的对象的指针的引用。在方法中,我想将第二个参数引用的位置更改为向量中的对象。然后让方法的调用者使用更改的指针,将新位置作为其目标。但是,我目前试图实现这一目标的尝试失败了。
有问题的方法:
void execute(std::vector<CanvasElement*>& elements,CanvasElement*& lastFocused)
我尝试设置lastFocused指向的值失败的方法示例:
lastFocused = elements[0];
*lastFocused = *elements[0];
回复以下评论的详细说明: 失败的是,函数内部的更改不会在函数范围之外反映出来。
我可以通过在应用程序运行时打印存储在每个指针中的地址来确认,该值确实在execute中设置,但在执行之外它没有被更改。
答案 0 :(得分:2)
作业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)
也就是说,你应该返回指针值而不是改变指针变量。
答案 1 :(得分:0)
我能够通过在向量中存储对指针的引用并更新该存储的引用来解决此问题。我不知道为什么直接设置它不起作用,但是这个黑客完成了工作。