2013-03-20 135 views
1

我想插入一个对我的对象的引用,但我得到大量的错误。我需要在自定义对象中修改哪些内容才能成功插入?如何在std :: map中插入自定义对象

的代码如下所示:

#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; 
} 

UPDATE:

  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; 
    } 
    
+0

[cppreference.com](http://en.cppreference.com/w/cpp/container/map)是非常有用的网站。 – 2013-03-20 18:49:01

+2

请注意,你的拷贝构造函数'A(A&a)'不是你想要的 - 你想要'A(一个const&)',而'operator ='是一样的。这与你的问题无关,这在下面解决。 – Yakk 2013-03-20 18:49:49

回答

3

不能存储在map引用。改用指针。

替换:

map<string, A&> m1; 

有了:

map<string, A*> m1; 

或者更好的(感谢WhozCraig!):

map<string, shared_ptr<A> > m1; 
+1

+1使用大脑指针(即智能指针;不是裸指针)。虽然我宁愿只存储实际的* *对象在地图 – WhozCraig 2013-03-20 18:49:43

0

你试图有一个map,仅仅保存引用。这是有点不可能的,因为参考文件通常需要在被引入概念时用参考进行初始化

当您使用m1["a"]时,该函数本身必须在让您分配给之前进行默认构建和项目就地它(你不能默认构建一个引用)。如果你想避免复制,你可以使用功能的emplace来让对象在原地建造,或者只需要map<std::string, A>,让你的生活变得轻松。

如果您不需要它来制作副本,您还可以尝试使用存储指针的map<std::string, A*>。但是,您将负责自行清理内存(除非您使用std::unique_ptr或其他朋友)。

0

不能将引用用作容器的键或值类型。你需要使用一个指针,最好是一个智能指针,比如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>(); 

希望它可以帮助作为开始。

+0

拷贝构造函数和赋值运算符将不得不改为使用映射''不作为编译为 – 2013-03-20 18:52:44

+0

@ShafikYaghmour:是的,但我认为这是或多或少不相关,因为它应该是固定的,不仅如果OP试图将其存储在“地图”中。当他尝试第一种方法并且他知道如何解决问题或者他知道如何提出关于SO的问题时,他会自动地遇到这个问题。 – 2013-03-20 19:00:17