2012-08-14 104 views
-1

我嘗試在我的類中使用std :: map作爲屬性。我使用的是Visual Studio 2012,而我的類是這樣的:使用std :: map與指針

public ref class MyClass 
{ 
    std::map<std::wstring,MyType> * mpMyMap; 
    MyClass() 
{ 
mpMyMap = new std::map<std::wstring,MyType>(); 
} 
~MyClass() 
{ 
delete mpMyMap; 
} 
Get(std::wstring name) 
{ 
    return mpMyMap[name]; 
} 
} 

At return mpMyMap [name];我得到錯誤,這種類型沒有運算符[]。我該怎麼辦?

+1

爲什麼'mpMyMap'是一個指針?你需要它是一個指針嗎(你可能不會)。如果你需要它是一個指針,你應該使用一個智能指針類型來包裝它(比如'std :: unique_ptr'或'boost :: scoped_ptr')。 – Chad 2012-08-14 14:08:56

+0

爲什麼在C++/CLI中使用std :: map?爲什麼不System :: Collections :: Generic :: Dictionary? – ForEveR 2012-08-14 14:22:24

回答

1

支架操作者是在地圖上,而不是在地圖上的指針...

嘗試:回報(* mpMyMap)[名稱];

1

mpMyMap是一個指針(爲此我看不出有什麼原因),所以你需要取消對它的引用:

return (*mpMyMap)[name]; 

如果mpMyMap必須是動態分配的,記得delete它在析構函數,要麼防止複製MyClass或實現複製構造函數和賦值運算符。

注意Get()缺少返回類型(應爲MyTypeMyType&)。將參數設爲Get() a const std::wstring&以避免不必要的複製,const作爲Get()不會修改它。

1

正確的語法是

MyType Get(std::wstring name) 
{ 
    return (*mpMyMap)[name]; 
} 

你也可以將地圖上的實例成員,而不是一個指針

std::map<std::wstring,MyType> mMyMap; 

然後Get你原來的代碼將工作,你會擺脫內存管理在MyClass的構造函數和析構函數中。

1

使用

return (*mpMyMap)[name]; 

return mpMyMap->operator[](name); 

附:這是什麼

public ref class MyClass 
//^^^^^^^^^^ 

另外,(在你的情況MyType)添加返回類型爲Get

+1

它不是本機C++,它是C++/CLI。 – ForEveR 2012-08-14 14:07:00

+0

@ForEveR - 我明白了,謝謝。它沒有用C++/CLI標記。 – 2012-08-14 14:07:44

1

由於mpMyMap是指針第一種變體

Get(std::wstring name) 
{ 
    return (*mpMyMap)[name]; 
} 

其次

Get(std::wstring name) 
{ 
    return mpMyMap->operator[](name); 
} 

Get應該有返回類型。

+1

你可能會讓你的parens錯位。它不應該是'(* mpMyMap)[name]'? – 2012-08-14 15:35:39

+0

@Robᵩ是啊。錯字。謝謝。 – ForEveR 2012-08-14 15:41:58