我正在创建一个模板化的结构矢量,它以某种方式模仿std :: map。 这是一个代表用法的简短程序(我不允许改变它!)
int main()
{
map<int> iv;
iv["john"] = 23;
int ia = iv["john"]++;
int ib = iv["john"];
cout /*<< ia << " " */<< ib << endl; // prints 23 24
try{
cout << iv["jack"] << endl; // should throw an exception
}catch(map<int>::Uninitialized&)
{
cout << "Uninitialized map element!" << endl;
};
}
首先,我为读取和写入创建了单个operator [],但是在找不到key的情况下不可能抛出异常。然后我查看了网页,发现要区分阅读和写作,我必须创建一个帮助类(代理或所谓的东西)。我找到了一些人为std :: map创建这样的类的主题,它正在工作。我允许自己使用他的想法和代码来实现我的版本。这是:
template <class TYPE>
class map
{
private:
struct FIELD
{
string key;
TYPE value;
};
vector<FIELD> data;
public:
class Uninitialized{};
TYPE read(string index)
{
typename vector<FIELD>::iterator it;
for(it = data.begin(); it != data.end(); it++)
{
if(it->key == index) return it->value;
else throw Uninitialized();
}
}
TYPE& write(string index)
{
typename vector<FIELD>::iterator it;
for(it = data.begin(); it != data.end(); it++)
{
if(it->key == index) return it->value;
}
}
class Helper;
Helper operator[](string index)
{
return Helper(this, index);
}
class Helper
{
friend class map;
private:
map* const help;
string ind;
Helper(map* someMap, string someIndex): help(someMap), ind(someIndex) {}
public:
operator TYPE ()
{
return help->read(ind);
}
const TYPE& operator= (const TYPE& val)
{
return help->write(ind);
}
};
};
它编译但是打印零而不是23 24并抛出异常。
他的写函数中的那个人只有return data[index]
但是我的程序甚至都没有编译。自从我开始学习C ++中的面向对象编程以来仅仅4个月,我的知识还不足以解决所有问题。
如果可以,请帮助我使其正常工作。