给出以下模板函数:
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 []? 谢谢,罗恩
答案 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
,则已声明array
为MyClass
个正常的[]
个对象数组。您MyClass
不需要array
运算符,因为MyClass
不是[]
的实例;它只是一个阵列。
如果有意义或方便,您需要在自己的类中重载{{1}}运算符。一个很好的例子是集合(例如地图)。另一个示例是自定义字符串类,您可能希望通过正则表达式对象进行索引,以在字符串中查找模式的匹配项。
答案 3 :(得分:0)
例如,如果您的类是动态数组的实现,您可能希望访问(单个)对象,就像它是一个数组一样 - 通过重载[]运算符来实现这一点。