STLコンテナに自作クラスをストアさせたいことはよくあるはず.
そうしたい場合はクラスを定義する際に以下のことを留意することが大事である.
クラスコンストラクタがメモリをアロケートする必要がある場合,コピーコンストラクタと=演算子オーバーロードを定義する必要がある.
忘れてはならないのはコピーコンストラクタと=演算子のオーバーロードである.それらを忘れればたちまちデスクトラクタにおいてメモリの2重解放が発生し,プログラムはたちまちクラッシュするだろう.
コード
以下のコードはコンストラクタでメモリをアロケートしているわけではないが,コピーコンストラクタと=演算子を定義している例である.のちにクラスを拡張してポインタフィールドを足した場合でも安全である.
クラスコンストラクタがメモリをアロケートする必要がある場合,コピーコンストラクタと=演算子オーバーロードを定義する必要がある.
忘れてはならないのはコピーコンストラクタと=演算子のオーバーロードである.それらを忘れればたちまちデスクトラクタにおいてメモリの2重解放が発生し,プログラムはたちまちクラッシュするだろう.
コード
以下のコードはコンストラクタでメモリをアロケートしているわけではないが,コピーコンストラクタと=演算子を定義している例である.のちにクラスを拡張してポインタフィールドを足した場合でも安全である.
#include <iostream> #include <cstdlib> #include <vector> #include <string> using namespace std; class TradeInfo { protected: string tradeId; int eventId; public: TradeInfo() {} virtual ~TradeInfo() {} TradeInfo(const TradeInfo& info) { tradeId = info.tradeId; eventId = info.eventId; } TradeInfo& operator =(const TradeInfo& info) { TradeInfo in; in.tradeId = info.tradeId; in.eventId = info.eventId; return in; } string GetTradeId() { return tradeId; } int GetEventId() { return eventId; } void SetTradeId(string str) { tradeId = str; } void SetEventid(int evt) { eventId = evt; } void dump() { cout << "TradeId-" << tradeId << ",EventId-" << eventId << endl; } }; TradeInfo GenerateTradeInfo(string str,int eventId) { TradeInfo t; t.SetTradeId(str); t.SetEventid(eventId); return t; } int main() { vector<TradeInfo> v; v.push_back(GenerateTradeInfo("abc",1)); TradeInfo t = v.at(0); t.dump(); return EXIT_SUCCESS; }
0 件のコメント:
コメントを投稿