Helper类,用于区分struct的std :: vector中的read和write

时间:2014-02-03 21:32:57

标签: c++ vector struct operator-overloading

我正在创建一个模板化的结构矢量,它以某种方式模仿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个月,我的知识还不足以解决所有问题。 如果可以,请帮助我使其正常工作。

0 个答案:

没有答案