基本上我可以从构造函数访问私有映射但不能访问
来自其他成员: - (
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;
};
提前谢谢! : - )
答案 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来获取元素。