代码之家  ›  专栏  ›  技术社区  ›  Hani Gotc

为什么我必须将映射值的类型从&更改为(int*)&

  •  0
  • Hani Gotc  · 技术社区  · 6 年前

    我有这个功能 getElement 返回指向映射值的指针。

     int * getElement(const int &key) const {
            return (int*)&m.find(key)->second;
        }
    

    比如我用 return &m.find(key)->second 它会创建一个编译错误:

    在成员函数“int*a::GetElement(const int&)const”中:12:30: 错误:从“const int*”到“int*”[-fpermissive]的转换无效

    • 我为什么要换衣服 &m.find(key)->second (int*)&m.find(key)->second 为了让代码正确编译?

    #include <iostream>
    #include <string>
    #include <map>
    
    class A {
        public:
        void addElement(const int &key, const int &value) {
             m.emplace(key,value);
        }
        int * getElement(const int &key) const {
            return (int*)&m.find(key)->second;
        }
        private:
        std::map<int,int> m;
    
    };
    
    
    int main()
    {
      A a;
      int value = 1;
      int key = 1;
      a.addElement(key,value);
      int * x = a.getElement(1);
      std::cout << *x << std::endl;
      return 0;
    }
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Konrad Rudolph    6 年前

    我为什么要换衣服 &m.find(key)->second (int*)&m.find(key)->second

    你没有。事实上,这样做可能会导致错误。相反,删除 const 如果您真的想修改映射值,则在成员函数上使用限定符。或返回 const int* 而不是 int* 从函数。

    当您将成员函数指定为 康斯特 ,然后 this 该函数内的指针变为指向 康斯特 类的实例。这反过来又使其数据成员 康斯特 ,可传递。

    因此,您的 std::map<int, int> 变成一个 std::map<int, int> const 在你的 getElement 功能。此外, std::map::find 的超负荷 康斯特 返回一个 const_iterator 因此 常量int* .

    事实上,要小心: std::map::iterator 不一定 T* . 所以你不应该回来 INT* 常量int* 你应该回来 std::map<int, int>::iterator (或 …::const_iterator )

        2
  •  1
  •   Tyker    6 年前

    这是一个纪念活动

    int * getElement(const int &key) const
    

    是常量,因此可以将所有数据membre作为常量访问

    int* 不同于 const int*