2013-03-20 137 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