我注意到了C ++中的内容。
SomeClass obj = SomeClass();
int boo = obj["foo"];
这叫什么,我该怎么做?
例如
class Boo {
public:
int GetValue (string item) {
switch (item) {
case "foo" : return 1;
case "apple" : return 2;
}
return 0;
}
}
Boo boo = Boo();
int foo = boo.GetValue("foo");
// instead of that I want to be able to do
int foo = boo["foo"];
答案 0 :(得分:2)
要使用[]
,您需要重载operator[]
:
class Boo {
public:
int operator[](string const &item) {
if (item == "foo")
return 1;
if (item == "apple")
return 2;
return 0;
}
};
您可能有兴趣知道std::map
已经提供了您似乎正在寻找的内容:
std::map<std::string, int> boo;
boo["foo"] = 1;
boo["apple"] = 2;
int foo = boo["foo"];
明显不同的是,当/如果你使用它来查找以前没有插入的值时,它会插入一个带有该键的新项目,值为0.
答案 1 :(得分:2)
这称为运算符重载。
您需要定义运算符[]
的工作方式:
#include <string>
class Boo {
public:
int operator[] (std::string item) {
if (item == "foo") return 1;
else if (item == "apple") return 2;
return 0;
}
};
Boo boo = Boo();
int foo = boo["foo"];
此外,switch变量必须具有整数类型,所以我改为if else。
答案 2 :(得分:1)
您需要重载[]运算符。 Here is an example(奇怪地在Java站点上)。
答案 3 :(得分:1)
你想要的是重载下标运算符(operator[]
);你会这样做:
class Boo {
public:
int operator[](const string & item) const {
// you can't use switch with non-integral types
if(item=="foo")
return 1;
else if(item=="apple")
return 2;
else
return 0;
}
}
Boo boo = Boo();
int foo = boo["foo"];
封装容器的类通常通过引用返回数据,以允许调用者修改存储的数据;这就是提供operator[]
的大多数STL容器所做的事情。