有一个vector存储的容器,用下标操作返回容器内的元素,类设计如下:
class Index
{
public:
friend ostream& operator<<(ostream& os, const Index& org);
Index(void);
~Index(void);
int& operator[] (const size_t);
const int& operator[](const size_t) const;
int AddData(const int data);
int RemoveData(const int data);
vector<int> GetList() const;
int SetList(const vector<int> &);
private:
vector<int> vList;
};
ostream& operator<<(ostream& os, const Index& org);
下标操作应定义为类成员,因为跟类本身关系紧密,如下实现
int& Index::operator[](const size_t index)
{
return vList[index];
}
const int& Index::operator[](const size_t index) const
{
return vList[index];
}
由于要作为左值,所以返回为引用,而且可能有const不同类型的调用,所以有两个版本,测试用例如下
int nData;
Index *index = new Index;
while (cin>>nData)
{
index->AddData(nData);
}
if (!(index->GetList().empty()))
{
//printf("index[1] = %d\n", index->operator[](1)); // ok
//printf("index[1] = %d\n", (*index)[1]); //ok
//printf("index[1] = %d\n", index(1)); //error
//cout << "index:" << (*index)[1] << endl; // error undefined "<<"
cout << "index:" << *index << endl;
//(*index)[1] = 1234;
}
if (index)
{
delete index;
index = NULL;
}
这里有个成员AddData主要用来加入元素,具体实现如下
int Index::AddData(const int data)
{
vList.push_back(data);
return 0;
}
在上面测试的时候,由于初开始没有定义<<操作符,所以只能使用printf先看输出结果;这里第一和第二都是正确的,但是第三情况一定要注意,初开始我就纳闷怎么老是输出一个奇怪的数字,其实是由于index是指针,而非直接的对象,所以是不对的;当然也能作为左值,最后一个赋值为1234的。
这里我还定义了<<操作符,所以默认也能输出,但是输出的东西就不是我能决定的了,因为测试或者使用的时候我就是用户,类是由设计者制定,如下:
ostream& operator<<(ostream& os, const Index& org)
{
//vector<int>::iterator iter = org.GetList().begin()
//for( ; iter!=org.GetList().end(); iter++)
for (int i = 0; i != org.GetList().size(); i++)
{
os << org[i] << " ";
}
return os;
}
这里输出了所有成员,并不能要求具体的成员函数。