【问题标题】:Use std::map with pointer使用带指针的 std::map
【发布时间】:2012-08-14 14:02:57
【问题描述】:

我尝试在课堂上使用 std::map 作为属性。我使用 Visual Studio 2012,我的课是这样的:

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

返回时 mpMyMap[name];我得到错误,这种类型没有 operator[]。我该怎么办?

【问题讨论】:

  • 为什么mpMyMap 是一个指针?您是否需要它作为指针(您可能不需要)。如果你确实需要它是一个指针,你应该使用一个智能指针类型来包装它(比如std::unique_ptr,或者boost::scoped_ptr)。
  • 为什么在 C++/CLI 中使用 std::map?为什么不 System::Collections::Generic::Dictionary?

标签: pointers stl c++-cli clr


【解决方案1】:

括号运算符在地图上,而不是在地图的指针上...

尝试:return (*mpMyMap)[name];

【讨论】:

    【解决方案2】:

    正确的语法是

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

    您也可以将地图设为实例成员而不是指针

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

    那么您在Get 中的原始代码将起作用,并且您将摆脱MyClass 的构造函数和析构函数中的内存管理。

    【讨论】:

      【解决方案3】:

      使用

      return (*mpMyMap)[name];
      

      return mpMyMap->operator[]( name );
      

      附:这是什么

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

      另外,为Get 添加返回类型(在您的情况下为MyType

      【讨论】:

      • 不是原生 C++,而是 C++/CLI。
      【解决方案4】:

      mpMyMap 是一个指针(我看不出有什么原因),所以你需要取消引用它:

      return (*mpMyMap)[name];
      

      如果mpMyMap 必须是动态分配的,请记住delete 在析构函数中并防止MyClass 的复制或实现复制构造函数和赋值运算符。

      注意Get() 缺少返回类型(应该是MyTypeMyType&amp;)。将Get() 的参数设为const std::wstring&amp; 以避免不必要的复制,const 因为Get() 不会修改它。

      【讨论】:

        【解决方案5】:

        由于mpMyMap 是指针,第一个变体是

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

        第二个

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

        Get 应该有返回类型。

        【讨论】:

        • 您的括号可能放错了位置。不应该是(*mpMyMap)[name]吗?
        • @Robᵩ 是的。印刷错误。谢谢。
        猜你喜欢
        • 2013-06-30
        • 1970-01-01
        • 2013-01-05
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多