#include <iostream>
#include <string>
#include <utility>
#include <map>
using namespace std;
class MyPair: public pair<string, int>
{
int _ref;
public:
MyPair(): pair<string, int>(), _ref(0) {}
MyPair(string arg1, int arg2): pair<string, int>(arg1, arg2), _ref(0) {}
~MyPair();
void inc() {
_ref++;
}
void dec() {
_ref--;
if (_ref == 0) delete this;
}
};
class MyMap: public map<string, int>
{
public:
MyMap(): map<string, int>() {}
MyMap(const map<string, int>& mp): map<string, int>(mp) {
//for(auto i=begin(); i!=end(); ++i) i->inc();
//I want to perform that instruction above, but it gives me an error
}
~MyMap() {
//for(auto i=begin(); i!=end(); i++) i->dec();
//same as here
}
void insertNewPair(MyPair * mypair) {
insert(*mypair);
mypair->inc();
}
};
int main(int argc, char **argv)
{
MyMap mymap;
mymap.insertNewPair(new MyPair("1", 1));
mymap.insertNewPair(new MyPair("2", 2));
cout << "mymap[\"1\"] = " << mymap["1"] << endl;
cout << "mymap[\"2\"] = " << mymap["2"] << endl;
return 0;
}
クラスに参照カウンターを追加できるように、std::pair からクラスをサブクラス化しました。「マイペア」と名付けました。また、std::map からサブクラス化し、「MyMap」と名付けました。そのため、新しい MyPair を MyMap に挿入するたびに、MyPair の inc() メンバー関数が呼び出されるため、MyPair は参照のカウンターである _ref メンバーをインクリメントします。MyMap のインスタンスを削除すると、含まれている各 MyPairs のすべての _ref メンバー関数が減少します。MyPair の _ref が 0 になった場合は、参照されなくなったことを意味するため、自身を削除します。
上記のコードが機能するのは、MyMap でコードのいくつかの行にコメントを付けることができたからです。それらのコメントを外すと、メイン関数に MyPair インスタンスを挿入しても、 std::pair に inc() や dec() のようなメンバーがないというエラーがコンパイラから返されます。単なる std::pair ではなく、これらのメンバーを含む MyPair インスタンスを挿入したことをコンパイラが認識しないことはわかっています。
MyMap 内で MyPair(inc() and dec()) のメンバーを呼び出す方法はありますか? 事前にご回答いただきありがとうございます。