2011-04-06 74 views
0

我有一個方法,它接受一個向量的引用,該向量包含指向對象的指針作爲第一個參數,並引用指向同一類型對象的指針作爲第二個參數。在該方法中,我想將第二個參數引用的位置更改爲向量中的對象。然後讓方法的調用者使用已更改的指針,將新位置作爲其目標。但是,我目前嘗試執行此操作失敗。無法將指針位置設置爲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

回答

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) 

也就是說,你應該返回一個指針值而不是改變一個指針變量。

+2

對,我同意最後的評論。我認爲返回指針,而不是通過引用傳遞參數是一個更好的選擇。 – 2011-04-06 07:38:20

+0

我同意這是更好的方法,但我正在使用的當前系統不允許這種行爲的實現被設置。 – XBigTK13X 2011-04-06 18:56:50