2011-08-30 163 views
1

給出下面的模板函數:何時需要實現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; 

?我何時需要定義運算符[]? 感謝,羅恩

回答

6

你宣佈你的類型的數組:

T array[2]; 

但是你在談論執行操作[]爲T,這是完全不同的概念。

如果您需要

T t; 
t[1] = blah 

然後,你需要實現operator []

1

假設你叫DoSomething與一對夫婦MyClass的對象,你已經宣佈arrayMyClass對象的正常排列。由於array不是MyClass的實例,因此您不需要[]運算符MyClass;它只是一個數組。

當您的類有意義或方便時,您會想要在自己的類中重載[]運算符。一個很好的例子是一個集合(例如地圖)。另一個例子是一個自定義的字符串類,你可能想通過正則表達式對象索引來爲你的字符串中的模式找到匹配。

2

因爲

T array[2]; 

是不是T類型的對象,其T的陣列因此

array[0]; 

正在索引的數組,你的對象不是一個,因此你不需要一個操作符[]。

0

如果你的類是動態數組的實現,例如,你要訪問的(單一)對象好像它是一個數組 - 你通過重載[]運算符。