2009-01-06 25 views
1

矢量據我所知,const_cast會刪除對象的常量性是不好的,const_cast會與對象

我有以下的使用情況下,

//note I cannot remove constness in the foo function 
foo(const std::vector<Object> & objectVec) { 

    ... 
    int size = (int) objectVec.size(); 
    std::vector<Object> tempObjectVec; 
    //Indexing here is to just show a part of the vector being 
    //modified 
    for (int i=0; i < (int) size-5; ++i) { 
     Object &a = const_cast<Object&> objectVec[i]; 
     tempObjectVec.push_back(a); 
    } 
    foo1(tempObjectVec); 
} 

如果我更改了foo1 tempObjectVec對象,將原來的對象在ObjectVec中的變化,我說是因爲我傳遞引用,進一步是這樣高效。你能否提出其他建議?

回答

3

嗯,這要看對象。但是當你將它們傳遞給push_back時,對象被複制,並且被複制。您可以通過向複製構造函數添加一些調試代碼來檢查該問題。因此,如果Object運行良好並且保持獨立的副本分離,那麼foo1可以更改它所喜歡的矢量。

一個更有效的方式做到這將有foo1接受一個開始和結束迭代器:

void foo1(std::vector<Object>::const_iterator start, 
      std::vector<Object>::const_iterator end); 

... 
foo1(objectVec.begin(), objectVec.end() - 5); 

如果你沒有用const_cast,那麼類型系統將確保foo1不改變任何元素,因爲這些是const_iterator。

1

tempObjectVec不能引用的一個載體,所以我相信它應該被宣佈爲是這樣的:

std::vector<Object> tempObjectVec; 

當你執行tempObjectVec.push_back(a),該對象的副本將作出推進入tempObjectVec載體。由於這是製作副本,你甚至不應該需要使用const_cast去除常量性,我不是你爲什麼需要做的是明確的。

+0

編輯的代碼,根據您的建議。 – kal 2009-01-06 02:32:16

1

我相信這是找您的發言:

const_cast<std::vector<Object>&> (objectVec)這將參考返回到非const std::vector這應該是可口foo1(我假設)。

修改原來的例子:

foo(const std::vector<Object> & objectVec) { 

    ... 
    foo1(const_cast<std::vector<Object> &>(objectVec)); 
} 

不過我建議在尋找的那個要求它使用非const的載體foo1的實際要求,你似乎表明您所有的興趣正在修改Object實例本身。

1

至於其他的已經說了,你的矢量的的push_back爲基準,但隨後將對象複製它引用。所以,在年底你結束了你的tempObjectVec內的副本。

載體不能存儲的引用,因爲它們不能被分配(分配給它影響不是基準本身,而是對象引用代替),其是用於在對象的矢量被保持的要求。引用也是沒有對象的。他們沒有自己的大小。因此它們不能被推入數組或任何向量中。通常你想在這樣的容器中存儲指針或智能指針來引用其他對象。看看你想要的boost pointer container庫。