2013-10-27 110 views
0

我是C++的新手,所以仍然在學習指針並習慣於使用它們。保持對象和引用在函數內創建的對象

我已經聲明瞭一個對象映射,以便存儲用戶稍後可能使用該標記鍵訪問的對象。

map<string,MyObject*> myMap; 

我加入到MYMAP對象在一個由我主

void myFunction(){ 
    ... 
    MyObject obj1(); 
    MyObject* objPtr; 
    objPtr = &obj1; 
    myMap.insert(pair<string,MyObject*>("xxxx", objPtr)); 
    ... 
    } 

當我執行此功能的對象的指針是完全插入到MYMAP,但功能執行後調用函數創建我猜我失去了對obj1的引用,因爲指針和對象是在函數內部本地創建的,所以我在地圖中仍然有一個元素「xxx」,但是我認爲它是後面的空引用。

如何保持全局對象和引用?我想在函數中創建這個對象,因爲它有一些需要從用戶obj1(m,n)中獲取的可變參數。謝謝你的幫助。

+2

爲什麼你不能在地圖中存儲對象的任何原因?這將大大簡化事情。 – juanchopanza

+0

爲什麼不使用'objPtr = new MyObject();'而不是'MyObject obj1(); objPtr = &obj1;'?這會在堆上創建超出函數範圍的對象。但是,在完成對象和地圖的使用後,需要刪除對象。在你的例子中,該對象在堆棧上創建並在函數完成後刪除。 – MKroehnert

+0

你可能想了解'new'關鍵字。 –

回答

2

除非你有很強的理由不這樣做用它來刪除這種情況下,它可能是簡單的存儲對象圖:

map<string, MyObject> myMap; 

然後:

void myFunction(){ 
    ... 
    myMap.insert(std::make_pair("xxxx", MyObject())); 
    ... 
} 
+0

我剛剛做了,它解決了問題... Thansk – JLA

1

你可以實例化你的對象的動態。

MyObject* objPtr = new MyObject; 

但是不要忘了,當你將不再有

delete objPtr; 
+1

你必須小心刪除'objPtr',因爲它會使存儲在地圖中的指針無效。 – MKroehnert

+0

你是對的,這對我來說很自然。 – Masadow

4

代碼線

MyObject obj1; 

限定本地變量保持的MyObject一個實例。一旦這個變量的上下文即將離開,對象將被破壞。破壞對象並不意味着指向它們的指針會以任何方式得到通知(例如,它們不會設置爲0),訪問它們是無效的。

您基本上有以下選項:

  • 創建於,而不是本地的對象。這是通過使用new關鍵字完成的。但是,你必須在某個時間點對delete這個對象。

    MyObject *obj1 = new MyObject(arguments...); 
    
  • 因爲這往往是難以管理,智能指針其中發明。例如,自C++ 11以來,添加了shared_ptr(但它在某些具有預發佈版本C++ 0x的編譯器中也可用)。這種類型的智能指針會在最後一個參考被銷燬時自動刪除對象。

    map<string,std::shared_ptr<MyObject>> myMap; // Note that I changed the type 
    
    std::shared_ptr<MyObject> obj1 = std::make_shared<MyObject>(arguments...); 
    myMap.insert(std::make_pair("xxxx", obj1)); 
    

    順便說一句,我用std::make_pair它會自動deduce the template types for you

  • 將值存儲在地圖中。根本不要使用指針。如果您的類型可以被複制(某些類型不能),以及您的某些設計決定不禁止您這樣做,那麼這是一個選項。但在大多數情況下,將值存儲在地圖中將是一個好主意。從要修改地圖獲取一個元素時,請使用引用:

    MyObject &obj = myMap["xxxx"]; // looking up the key 
    obj.doSomeAction();   // modify it; no need to re-insert 
    

    引用的行爲類似於指針(某些情況下即他們只「點」),但也有一些差異。例如,引用始終指向其整個生命週期中的相同實例(不能重新分配引用)。而且,它們的語法等於值,即不需要->

就個人而言,我更喜歡第三個選擇,如果你不需要把指針指向同一個對象在程序的多個地方。如果是這種情況,我們說「共享」對象,這正是你想使用「共享」指針的情況。第一種選擇是非常低級的,應該被視爲「過時」。

+0

使用'shared_ptr'的值爲+1,但是您能否指出這隻適用於最新的標準? – MKroehnert

+1

@MKroehnert謝謝,我添加了一條評論。 – leemes

+0

非常感謝你leemes,只是存儲對象而不是指針來解決所有問題......並且你的解釋非常有用 – JLA