1

オブジェクトへの参照を挿入しようとしていますが、多数のエラーが発生します。正常に挿入できるように、カスタムオブジェクトで何を変更する必要がありますか?

コードを以下に示します。

#include <map>
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
    A()
    {
            cout << "default constructor" << endl;
    }

    A(A & a)
    {
            cout << "copy constructor" << endl;
    }

    A & operator=(A & a)
    {
            cout << "assignment operator" << endl;
            return *this;
    }

    ~A()
    {
            cout << "destructor" << endl;
    }
};

int main()
{
    map<string, A&> m1;
    A a;
    m1["a"] = a;
    return 0;
}

アップデート:

  1. のような参照で地図を作成することが可能ですmap<string, A&>

  2. エラーは[]演算子の使用にありました。次の変更を行うことにより、コードは機能します

    typedef map<string, A&> mymap;
    
    int main()
    {
       mymap m1;
       A a;
       cout << &a << endl;
       m1.insert(make_pair<string, A&>("a", a));
       mymap::iterator it = m1.find("a");
       A &b = (*it).second;
       cout << &b << endl; // same memory address as a
       return 0;
    }
    
4

3 に答える 3

3

に参照を保存することはできませんmap。代わりにポインタを使用してください。

交換:

map<string, A&> m1;

と:

map<string, A*> m1;

またはさらに良い(WhozCraigに感謝します!):

map<string, shared_ptr<A> > m1;
于 2013-03-20T18:48:44.893 に答える
1

コンテナーのキーまたは値の型として参照を使用することはできません。ポインター、できればスマートポインターを使用する必要があります。std::shared_ptrまたは、これが高すぎない場合は、オブジェクトのコピーを保存できます。以下にいくつかのオプションを示します。

map<string,A> mc; // stores copies of A

map<string,A*> mp; // you need to take care of memory management - avoid that

map<string,shared_ptr<A>> msp; // prefered

後者を使用するには、次のような要素を作成して挿入できます。

msp["a"] = make_shared<A>();

それが最初に役立つことを願っています。

于 2013-03-20T18:49:57.043 に答える
0

map参照のみを格納する を使用しようとしています。通常、参照は概念化された瞬間に参照で初期化する必要があるため、これは少し不可能です。

を使用する場合m1["a"]、その関数自体は、割り当てを許可する前に、デフォルトで構築し、項目をインプレースにする必要があります (参照をデフォルトで構築することはできません)。コピーが作成されるのを避けようとしている場合はemplace、関数のフレーバーを使用して、オブジェクトをその場で構築するか、単にmap<std::string, A>作成して簡単にすることができます。

コピーを作成しないために必要な場合は、map<std::string, A*>ポインターを格納する を使用することもできます。ただし、メモリのクリーンアップは自分で行う必要があります (使用している場合std::unique_ptrや友人が使用している場合を除きます)。

于 2013-03-20T18:49:33.860 に答える