对于自定义类,通过[“”]或[int]访问C ++组件

时间:2012-02-16 01:48:29

标签: c++

我注意到了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"];

4 个答案:

答案 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容器所做的事情。