2021-03-05に更新

[C++] Vector配列でクラスを扱う時にクラスメンバーにリファレンスが含まれていると面倒

C++

オブジェクトをVector配列に積んだり消したりするソースでも書くか・・・

#include <vector>
#include <algorithm>
using namespace std;

class A
{
public:
    A() = delete;
    A(int item) : m_item(item) {}
private:
    int &m_item;
};

class MainProc
{
public:
    void AddVector(A obj)
    {
        m_vecA.emplace_back(obj);
    }
    void DelVector(A srcobj)
    {
        if (m_vecA.size())
        {
            auto it = remove_if(m_vecA.begin(), m_vecA.end(),
                [&](A &dstobj) { return (dstobj.m_item == srcobj.m_item); });
            m_vecA.erase(it, m_vecA.end());
        }
    }
private:
    vector<A> m_vecA;
};

int main()
{
    MainProc MP;
    int i1 = 1, i2 = 2;
    A obj1(i1), obj2(i2);
    MP.AddVector(obj1);
    MP.AddVector(obj2);
    MP.DelVector(obj1);
}

ビルドしたら難しそうなエラーが出ました。

main.cpp:24:122:   required from here
/usr/include/c++/7/bits/stl_algo.h:871:16: error: use of deleted function ‘A& A::operator=(A&&)’
      *__result = _GLIBCXX_MOVE(*__first);
                ^
main.cpp:5:7: note: ‘A& A::operator=(A&&)’ is implicitly deleted because the default definition would be ill-formed:
 class A
 :

想像なのであまりあてにしないで欲しいんですが、多分↓のような感じ?

・remove_ifとかeraseのところでclassAの代入(operator=)をしたいよ
 →でもoperator=はこちらでdeleteしときましたよ
  →なんでかというと代入できるならしたいけどclassAのメンバーにリファレンスがいて無理だからだよ

面倒なのでclassAのm_itemをポインタ型にして解決しました。

ツイッターでシェア
みんなに共有、忘れないようにメモ

uskz

自分のために書いていきます

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント