我什么时候需要实现operator []?

时间:2011-08-30 08:03:55

标签: c++ class templates

给出以下模板函数:

template <class T>
void DoSomething(T &obj1, T &obj2)
{
      if(obj1 > obj2)
        cout<<"obj1 bigger: "<<obj1;
      else if(obj1 == obj2)
        cout<<"equal";
      else cout<<"obj2 bigger: "<<obj2;

      T tmp(3);
      T array[2];
      array[0]=obj1;
      array[1]=obj2;
}

我需要定义一个名为MyClass的类(仅限声明,即只是.h文件),它可以使用该模板函数。 我定义了下一个声明:

class MyClass
{
public:
    MyClass();    // default ctor
    MyClass(int x);  // for ctor with one argument
    bool operator ==(const MyClass& myclass) const;
    bool operator >(const MyClass& myclass) const;
    friend ostream& operator<<(ostream &out,const MyClass& myclass);  // output operator

};

我不明白为什么不需要为行定义operator []:

array[0]=obj1; array[1]=obj2; 

?我什么时候需要定义operator []? 谢谢,罗恩

4 个答案:

答案 0 :(得分:6)

您为类型声明了一个数组:

T array[2];

但是你正在讨论为T实现operator [],这是完全不同的概念。

如果您需要

T t;
t[1] = blah

然后你需要实现operator []

答案 1 :(得分:2)

由于

T array[2];

不是T对象,它是T的数组。所以

array[0];

索引数组,而不是您的某个对象,因此您不需要运算符[]。

答案 2 :(得分:1)

假设您使用几个DoSomething对象调用MyClass,则已声明arrayMyClass个正常的[]个对象数组。您MyClass不需要array运算符,因为MyClass不是[]的实例;它只是一个阵列。

如果有意义或方便,您需要在自己的类中重载{{1}}运算符。一个很好的例子是集合(例如地图)。另一个示例是自定义字符串类,您可能希望通过正则表达式对象进行索引,以在字符串中查找模式的匹配项。

答案 3 :(得分:0)

例如,如果您的类是动态数组的实现,您可能希望访问(单个)对象,就像它是一个数组一样 - 通过重载[]运算符来实现这一点。