2015-04-01 53 views
1

我有以下設置:爲什麼我不能重新分配以前在C++中分配在堆棧上的變量(「框架」的複製賦值操作符被隱式刪除)?

struct Frame { 
    Frame(vector<Region> regions_) 
     : regions(regions_){} 
    const vector<Region> regions; 
}; 

現在,在我的代碼不同的部分,我想創建一個vector<Frame>和創建以下for循環:

vector<Frame> shot; 
Frame currentFrame = generateRandomFrame(); 
for (int i = 0; i < length; i++) { 
    shot.push_back(currentFrame); 
    currentFrame = generateNextFrame(currentFrame); // this line gives the error 
} 

其中generateNextFrame具有以下簽名: Frame FrameGenerator::generateNextFrame(Frame previousFrame)

現在,這段代碼不會編譯,並給我以下錯誤:

copy assignment operator of 'Frame' is implicitly 
deleted because field 'regions' has no copy assignment 
operator const vector<Region> regions; 

現在,我不完全理解這個錯誤信息。我強烈地認爲這與currentFrame被分配在堆棧而不是堆堆上的事實有關,因此我不能重新分配變量。然而,作爲C++的新手,我並不熟悉如何處理這些情況。我應該在這裏使用指針,並嘗試在堆上分配currentFrame

爲了清楚起見,我的目標是生成一系列frames(取決於前一幀)。任何人都可以在這裏指出我正確的方向嗎?

更新: 非常感謝在評論中所有的提示,我現在明白了,這個問題來自於我宣佈regionsconst的事實。我重寫了代碼使用指針,而不是堆變量,現在看起來是這樣的:

vector<Frame> shot; 
Frame currentFrame = generateRandomFrame(); 
Frame *currentFramePtr = &currentFrame; // the first frame in the shot is random 
for (int i = 0; i < length; i++) { 
    shot.push_back(*currentFramePtr); 
    Frame tmpFrame = generateNextFrame(*currentFramePtr); 
    currentFramePtr = &tmpFrame; 
} 

此代碼現在編譯,但是它仍然不能做我想做的。根據我的理解,現在應該可以工作,因爲我將currentFrame存儲在指針中,所以我可以輕鬆地用我創建的新對象覆蓋它。但似乎仍然存在缺陷,幀生成不能按預期工作(即任何新幀都是由0個區域生成的,而區域數量應與前一幀相同)。任何人都可以看到這個更新版本的代碼有什麼問題嗎?

+2

你不能改變'const'的東西,所以你不能改變'currentFrame.regions'。 – immibis 2015-04-01 06:42:15

+0

啊好的!我知道在C++中通常會覆蓋運算符。是否可以重寫「Frame」的「複製」操作符?那有意義嗎? – nburk 2015-04-01 06:43:49

+0

你在這裏打電話給'operator ='。 ''currentFrame = ...;'調用'currentFrame.operator =(...);' – immibis 2015-04-01 06:44:25

回答

1

您的struct聲明const成員,由於const成員沒有複製賦值運算符,因此強制編譯器隱式刪除默認複製賦值運算符。

下面的代碼替換您從示例中省略的位,並顯示如何生成一堆Frame *而不是Frame s。基本上,這是解決編譯問題的一個解決方法,但是如果你的代碼需要使用堆棧或者你不得不重構太多,它可能不適合你的具體需求。

#include <iostream> 
#include <vector> 

struct Region{}; 

struct Frame { 
    Frame(std::vector<Region> regions_) 
    : regions(regions_){} 
    const std::vector<Region> regions; 
}; 

int main(int argc, const char * argv[]) { 

    std::vector<Frame *> shot; 
    Frame * currentFrame = new Frame((std::vector<Region>())); 
    for (int i = 0; i < 10; i++) { 
     shot.push_back(currentFrame); 
     currentFrame = new Frame(std::vector<Region>()); 
    } 

    return 0; 
} 

同時請注意: how to use const_cast? - const_cast不會爲你工作,會造成UB。以防萬一;)

+0

非常感謝您的回答!你可能有一個建議,我怎樣才能達到我的目標,而不宣佈'地區'非''CONST'? – nburk 2015-04-01 07:04:18

+0

啊好極了,那就是我一直在尋找的! :) 非常感謝! – nburk 2015-04-01 07:10:37