如何从公共函数成员访问地图私有成员

How Do I access a map private member from public function member

本文关键字:成员 访问 地图 函数      更新时间:2023-10-16

基本上我可以从构造函数访问私有地图,但不能

来自其他成员:-(

class FAnagramGenerator {
  public:
    FAnagramGenerator(){
        std::string len2[3] = {"blue", "red", "green"};
        std::string len3[3] = {"pink", "orange", "white"};
        std::string len4[3] = {"black", "yellow", "brown"};
        this->list[2] = len2;
        this->list[3] = len3;
        this->list[4] = len4;
        std::cout << this->list[3][1] << std::endl; // Works!!!
    };
    std::string getAnagram(int size) const{
        std::cout << this->list[size][1] << std::endl; // Doesnt!!
        return this->list[size][1];
    };
  private:
    std::map<int, std::string*> list;
};

提前感谢! :-(

你的三个数组:

 std::string len2[3] = {"blue", "red", "green"};
 std::string len3[3] = {"pink", "orange", "white"};
 std::string len4[3] = {"black", "yellow", "brown"};

施工后超出范围,最终会在地图中出现悬空指针。

应改用 std::array 类型的值,这些值提供深层复制。

其他问题:您的成员函数getAnagram const,而std::map的运算符[]则不是。你必须使用 at(( (或 find((( 代替:

class FAnagramGenerator {
  public:
    FAnagramGenerator()
      : list { // better here in initialization list
         {2, { "blue",    "red", "green"}},
         {3, { "pink", "orange", "white"}},
         {4, {"black", "yellow", "brown"}}
      }
    {
        std::cout << this->list[3][1] << std::endl;
    }; // <- useless semicolon
    std::string getAnagram(int size) const{
        std::cout << this->list.at(size)[1] << std::endl;
        return this->list.at(size)[1];
    }; // <- useless semicolon
  private:
    std::map<int, std::array<std::string,3>> list;
    //            ^^^^^^^^^^^^^^^^^^^^^^^^^
};
这与

private无关。这与const有关。

使用at .如果密钥不存在,operator[] on std::map 将创建它,因此操作员需要非const访问权限。使用 at 而不是 operator[] ,如果密钥不存在,则会引发异常,这将解决您的问题。

std::cout << this->list.at(size)[1] << std::endl;
return this->list.at(size)[1];

或者,您可以从 getAnagram 中删除 const 限定符,但前一种解决方案更可取。

std::string getAnagram(int size) const{

此代码行中的 const 意味着您不能从函数内部调用任何非 const 函数。

operator[](这是隐藏在符号中的函数(是非常量(请参阅C++常量映射元素访问(

相反,你应该使用 std::map::at 来获取元素。