我有以下設置:爲什麼我不能重新分配以前在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
(取決於前一幀)。任何人都可以在這裏指出我正確的方向嗎?
更新: 非常感謝在評論中所有的提示,我現在明白了,這個問題來自於我宣佈regions
爲const
的事實。我重寫了代碼使用指針,而不是堆變量,現在看起來是這樣的:
vector<Frame> shot;
Frame currentFrame = generateRandomFrame();
Frame *currentFramePtr = ¤tFrame; // 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個區域生成的,而區域數量應與前一幀相同)。任何人都可以看到這個更新版本的代碼有什麼問題嗎?
你不能改變'const'的東西,所以你不能改變'currentFrame.regions'。 – immibis 2015-04-01 06:42:15
啊好的!我知道在C++中通常會覆蓋運算符。是否可以重寫「Frame」的「複製」操作符?那有意義嗎? – nburk 2015-04-01 06:43:49
你在這裏打電話給'operator ='。 ''currentFrame = ...;'調用'currentFrame.operator =(...);' – immibis 2015-04-01 06:44:25