簡體   English   中英

替換std :: deque const元素

[英]Replace std::deque const element

我在雙端隊列中有const對象:

class ConstClass {
  public:
    ConstClass(int variable): variable_(variable) {}
  private:
    const int variable_;
};

std::deque<ConstClass> objects;
objects.push_back(ConstClass(1));
objects.push_back(ConstClass(2));
objects.push_back(ConstClass(3));

如何用另一個替換第二個元素?

如果我嘗試使用[] =std :: replace來執行此操作,則會得到:

編譯器無法為類'ConstClass'生成operator =

我能想到的唯一方法是創建一個空的雙端隊列, push_back()從那里的“對象”中所有元素(用新的元素替換第N個元素),然后清除() “對象”雙端隊列並把復制的push_back()元素從臨時雙端隊列返回到“對象”。

我敢肯定還有一種更明智的方法,但是我不知道怎么做?

你不能 您的容器無效,因為其元素類型必須是可復制分配的或可移動分配的,而您的容器和容器都不是。 在構造時無法診斷出該錯誤,但是當您嘗試執行依賴於此屬性的操作時,您已經看到產生的編譯錯誤。

您可以通過重載元素類型的復制和移動賦值運算符來忽略const成員,從而使其合法且可編譯,但是尚不清楚這是否有意義。

std::unique_ptr到動態分配的對象中,或者重新考慮模型。

該問題的更多背景信息將是有用的,您如何在這里結束? ConstClass的目的是什么,為什么必須是const?

假設有充分的理由您不能在沒有黑客的情況下解決此問題,可以這樣做:

int main() {

   std::deque<std::shared_ptr<ConstClass>> objects;
   objects.push_back(std::make_shared<ConstClass>(1));
   objects.push_back(std::make_shared<ConstClass>(2));
   objects.push_back(std::make_shared<ConstClass>(3));

   objects[2] = std::make_shared<ConstClass>(100);
}

但是肯定有更好的方法...

(您可能想使用unique_ptr而不是shared,所以我不確定您的要求是什么。如果您使用的是較舊的平台,則boost shared_ptr也可以使用)

通過指定const成員,您將禁用默認的賦值運算符,並且您不應做任何招數/技巧來克服該限制。

您可以改為使用智能指針(如果需要共享所有權,則可以是唯一的或共享的),例如:

int main(){
    std::deque<std::unique_ptr<ConstClass> > objects;
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(1)));
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(2)));
    objects.push_back(std::unique_ptr<ConstClass>(new ConstClass(3)));

    objects[2]=std::unique_ptr<ConstClass>(new ConstClass(4));
    // or any other usage of assignment operator, depending on the needs
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM