无法将指针位置设置为C++中另一个指针位置的指针位置

问题描述:

我有一个方法,它接受一个向量的引用,该向量包含指向对象的指针作为第一个参数,并引用指向同一类型对象的指针作为第二个参数。在该方法中,我想将第二个参数引用的位置更改为向量中的对象。然后让方法的调用者使用已更改的指针,将新位置作为其目标。但是,我目前尝试执行此操作失败。无法将指针位置设置为C++中另一个指针位置的指针位置

问题的方法:

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

的方式,我没有成功尝试设置值指出例子由lastFocused:

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

在回复中阐述以下评论: 的失败的原因是函数内部的更改不会在该函数的范围之外反映出来。

我可以通过在应用程序运行期间打印存储在每个指针中的地址来确认该值是否确实在执行中设置,但是在执行之外它没有被更改。

+4

第一个看起来恰到好处。 – 2011-04-06 06:31:05

+2

你正在得到一个编译器错误,或者函数内部的指针改变没有反映在外面?即你能详细说明什么是失败? – Naveen 2011-04-06 06:33:29

+0

我已经添加了详细说明。 – XBigTK13X 2011-04-06 18:46:15

我能够解决这个问题,方法是将指针的引用存储在向量中并更新存储的引用。我不知道为什么直接设置它不起作用,但这个黑客完成了工作。

分配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) 

也就是说,你应该返回一个指针值而不是改变一个指针变量。

+2

对,我同意最后的评论。我认为返回指针,而不是通过引用传递参数是一个更好的选择。 – 2011-04-06 07:38:20

+0

我同意这是更好的方法,但我正在使用的当前系统不允许这种行为的实现被设置。 – XBigTK13X 2011-04-06 18:56:50