如何从公共功能成员访问地图私有成员

时间:2018-01-10 02:25:55

标签: c++

基本上我可以从构造函数访问私有映射但不能访问

来自其他成员: - (

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;
};
提前谢谢! : - )

3 个答案:

答案 0 :(得分:1)

这与private无关。它与const

有关

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

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

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

答案 1 :(得分:1)

你的三个阵列:

 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的operator[]为{n}&t; t。您必须使用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;
    //            ^^^^^^^^^^^^^^^^^^^^^^^^^
};

答案 2 :(得分:0)

std::string getAnagram(int size) const{

这行代码中的const意味着你不能在函数中调用任何非const的函数。

operator[](这是一个隐藏在符号中的函数)是非const的(参见C++ const map element access

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