#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中繼承了一個類,以便我可以在其中附加一個引用計數器。我將它命名爲「MyPair」。我也從std :: map分類,並將其命名爲「MyMap」。因此,每次我在MyMap中插入新的MyPair時,都會調用MyPair的inc()成員函數,這樣MyPair就會增加其參考計數器的_ref成員。如果我刪除了MyMap的一個實例,它將遞減其包含的每個MyPair的所有_ref成員函數。如果MyPair中的_ref達到0,這意味着它不再被引用,所以它會自己刪除。在C++中繼承std :: pair和std :: map
上面的代碼有效,因爲我設法在MyMap中註釋了一些代碼行。當我取消註釋它們時,編譯器給我一個錯誤,說std :: pair沒有像inc()和dec()這樣的成員,即使我在主函數中插入MyPair實例。我知道編譯器沒有注意到我插入了包含這些成員的MyPair實例,而不僅僅是一個普通的std :: pair。
有沒有辦法可以在MyMap中調用MyPair(inc()和dec())的成員? 感謝您提前回答。
從它們派生出來已經夠糟糕了。公開這樣做是在尋求麻煩。 – chris
試着更清楚地解釋你在做什麼。你只是想創建一個引用計數對。 (這5個字總結你的段落)也試圖顯示什麼不工作清楚。 (這裏顯示編譯器的錯誤,並讓代碼像你一樣評論什麼是錯誤的) – dzada
正如已經解釋過的這個os非常糟糕的代碼。我建議你閱讀一些關於C++的書,比如Effective C++,Effective STL和其他類似的書。現代C++擁有所有的工具,所以沒有ne會寫這樣的代碼。 – Phil1970