簡體   English   中英

如何避免在 C++ 中使用復制構造函數和移動構造函數

[英]How to avoid use of copy-constructor and move constructor in C++

我遇到了 C++ 項目的類實現問題。 這是代碼:

A {
    private:
    std::atomic<bool> flag;    
    std::atomic<int> value;

    public:
        A(){}
};

class B{
    private:
    std::vector<A> vett;

    public:
        B(){}
        void add_A(A a){
            vett.push_back(a);
        }
};

int main() {
    // Write C++ code here
    B b{};
    return 0;
}

我知道編譯錯誤是由std::atomic引起的,因為它不是可復制構造的,也不是可復制分配的,並且 class A 具有 std::atomic 作為屬性。 不幸的是 class A 應該是線程安全的 class,所以我需要使用std::atomicstd::mutex (這也是不可復制的)。 通過閱讀其他問題,為了克服這個問題,我可以為 std::atomic 創建一個包裝器結構,但是這樣會損害原子性,那么另一種可能的解決方案是什么?

通過顯式復制原子成員的當前值,可以使A既可復制又可移動。 當然,這些方法都不是線程安全的。

struct A{
    std::atomic<int> m_member{false};

    A()=default;
    A(const A& other):m_member(other.m_member.load()){}
    A(A&& other):m_member(other.m_member.load()){
        // Move other members
    }
    A& operator=(const A& other){
        if(&other!=this){
            // De-init current members.
            this->m_member=other.m_member.load();
            // Copy other members.
        }
        return *this;
    }
    A& operator=(A&& other){
        if(&other!=this){
            // De-init current members.
            this->m_member=other.m_member.load();
            // Move other members.
        }
        return *this;
    }
};

暫無
暫無

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

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