2017-05-04 61 views
-1

假設我想要一個私人指針指向我班的地圖。如果我的構造函數(一個布爾值)的參數爲true,我希望它指向NULL。這是否是正確的做法? (如果我的布爾是假的,我在地圖上添加第一個元素)C++正確初始化和處理指向地圖的指針

using namespace std; 
#include <map> 

class Class { 
public: 
    Class(bool a) 
    : _myMap(0) { 
    if (a) { 
     _myMap = new map<int, bool>(); // initialized to NULL 
    } else { 
     (*_myMap)[0] = true; // added a first key-value to map 
    } 
    } 
    ~Class() { 
    delete _myMap; 
} 
private: 
    map<int, bool>* _myMap; 
} 

編輯 這是我如何固定我的問題:

using namespace std; 
#include <map> 

class Class { 
public: 
    Class(bool a) 
    : _myMap(0) { // map initialized to NULL 
    if (a) { 
     _myMap = new map<int, bool>(); 
    } 
    } 
    ~Class() { 
    delete _myMap; 
    } 
    void addValue(bool b, int i) { 
    if (_myMap != 0) { 
     (*_myMap)[i] = b; 
    } 
    } 
private: 
    map<int, bool>* _myMap; 
} 

要回答這個問題問我爲什麼,我需要一個人指向地圖而不是簡單地圖的指針:當我使用我的組件類時,如果(在構造函數中使用)爲false,即我的地圖指向NULL,則不想添加值。

+2

第一件事第一件事。爲什麼指針?爲什麼動態分配? –

+0

我想要一個指針,因爲我希望能夠檢查我的地圖是否指向NULL。我不確定我的地圖指針的正確初始化方式。 – klaus

+0

那麼,你的意思是什麼「NULL」?爲什麼你要「指向NULL」? –

回答

0

: _myMap(0)將指針初始化爲NULL

然後

_myMap = new map<int, bool>(); // initialized to NULL 

分配它一個map和點_myMap。這與空指針相反。 new的返回值保證不爲NULL

else分支,你做

(*_myMap)[0] = true; 

這不確定的行爲。您正在取消引用_myMap,它是一個空指針。

結論:不,這是不正確的。


你可以做修復的代碼,這個特殊的位:

if (!a) { 
    _myMap = new map<int, bool>(); 
    (*_myMap)[0] = true; // added a first key-value to map 
} 

但是你仍然必須寫一個正確的拷貝構造函數和賦值操作符,整個事情感到噁心。考慮使用「智能指針」類型。


根據你的意見,你似乎想要一個(可能是空的)地圖在你的班級。沒有指針可以做得更容易:

class Class { 
public: 
    Class(bool a) 
    { 
    if (!a) { 
     _myMap[0] = true; // added a first key-value to map 
    } 
    } 

private: 
    map<int, bool> _myMap; 
} 

現在我們不需要任何動態內存分配或自定義析構函數。

+0

謝謝。然後,我將保持_myMap(0)在構造函數中,並刪除新的。但是如果我想添加元素到我的地圖中,我需要像我一樣去引用'_myMap',對吧? – klaus

+2

@klaus所以你希望指針指向NULL,但你不知道這意味着什麼。看來你不明白指針是什麼,所以也許你應該重新考慮你是否需要代碼。 – juanchopanza

0

暫時忽略了使生活難度比它必須是理...

Class(bool a) 
    : _myMap(0) { 
    if (a) { 

     // You are not doing what your comment says 
     // you want to do. 
     _myMap = new map<int, bool>(); // initialized to NULL 
    } else { 

     // This is bad. 
     // myMap is still a null pointer. You are dereferencing 
     // a null pointer. Only bad things can happen with this. 
     (*_myMap)[0] = true; // added a first key-value to map 
    } 
    } 

可以使用的線沿線的東西:

Class(bool a) 
    : _myMap(nullptr) { // Use nullptr for pointers. 
    if (a) { 
     // There is nothing to do. 
    } else { 
     // Allocate memory for myMap 
     _myMap = new map<int, bool>(); // initialized to NULL 

     // Now you can dereference the pointer. 
     (*_myMap)[0] = true; // added a first key-value to map 
    } 
    } 

不要忘記the Rule of Three當你在你的對象中存儲一個指向堆內存的指針時。