2011-12-23 63 views
5

在我的課,我有兩個私有成員:我可以得到一個指向當前的重複值

std::list<MyObject> objects; 
MyObject *selecteObj; 

當事件發生時,我想通過列表進行迭代和運行某種測試即會只在列表中的某個項目上產生真實。我想保存一個指向該項目的指針以供其他地方使用。

std::list<MyObject>::iterator i; 
for (i = objects.begin(); i!=objects.end(); ++i){ 
    if (i->test()) 
     selectedObj = i; 
} 

別處另一種方法

if (selectedObj !=null) 
    tmpObj->doSomething(); 

然而,這並不工作,因爲i不是指針,它即使你可以把它像一個指針MyObject迭代器。

是否有可能檢索迭代器內部存儲以供其他位置使用的指針?

我在想這個不對嗎?

完成我想要做的事情的正確方法是什麼?

回答

12

是否有可能檢索迭代器內部存儲以供其他位置使用的指針?

當然,只是取消引用與*迭代,然後得到通過&一個指向對象:

selectedObj = &*i; 

在一個側面說明,你記得NULL循環之前進行初始化selectedObj

+1

當然你的意思是'std :: addressof(* i)',不是嗎? OP沒有詢問如何調用該對象的'&'-operator ... – 2011-12-23 17:38:08

+0

@KerrekSB:我想,你的意思是'std :: addressof'(而不是'std :: address_of'),不是嗎? :P – Nawaz 2011-12-23 17:40:30

+0

@Nawaz:哦,我*說了什麼? ;-) – 2011-12-23 17:42:31

6

是否有可能檢索迭代器內部存儲以供其他位置使用的指針?

是的。作爲@FredOverflow說,這樣做:

selectedObj = &*i; 

但是,如果你能使用C++ 11的功能,那麼你就可以享受寫的用基於範圍的for循環更好的語法爲:

MyObject *selectedObj = NULL; 
for (MyObject & obj : objects) 
{ 
    if (obj.test()) 
     selectedObj = &obj; //store the address 
} 

看起來更好嗎?不需要迭代器和書寫語法,如&*i。還應該注意的是,如果類MyObject重載了operator &,那麼&*i將不起作用,因爲它會調用operator&函數,而不是讓您獲得對象的地址!如果是這樣,那麼你就寫(MyObject*)&(char&)*i得到的*i地址,或者在C++ 11可以使用std::addressof(*i),你可以定義自己,如果你不能使用C++ 11:

template< class T > 
T* addressof(T& arg) { 
    return (T*)&(char&)arg; 
} 

代碼取自這裏:std::addressof

相關問題