何时需要实现operator []?
问题描述:
给出下面的模板函数:何时需要实现operator []?
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
};
我不明白的是为什么没有必要定义操作符[]的线路:
array[0]=obj1; array[1]=obj2;
?我何时需要定义运算符[]? 感谢,罗恩
答
你宣布你的类型的数组:
T array[2];
但是你在谈论执行操作[]为T
,这是完全不同的概念。
如果您需要
T t;
t[1] = blah
然后,你需要实现operator []
答
假设你叫DoSomething
与一对夫妇MyClass
的对象,你已经宣布array
是MyClass
对象的正常排列。由于array
不是MyClass
的实例,因此您不需要[]
运算符MyClass
;它只是一个数组。
当您的类有意义或方便时,您会想要在自己的类中重载[]
运算符。一个很好的例子是一个集合(例如地图)。另一个例子是一个自定义的字符串类,你可能想通过正则表达式对象索引来为你的字符串中的模式找到匹配。
答
因为
T array[2];
是不是T类型的对象,其T的阵列因此
array[0];
正在索引的数组,你的对象不是一个,因此你不需要一个操作符[]。
答
如果你的类是动态数组的实现,例如,你要访问的(单一)对象好像它是一个数组 - 你通过重载[]运算符。