標準コンテナを基底クラスに使ってもいいんですか? – プログラミング – Home

標準コンテナを基底クラスに使ってもいい...
 
通知
すべてクリア

[解決済] 標準コンテナを基底クラスに使ってもいいんですか?


kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

std::vectorとかstd::mapとかを継承して新しいクラスを
作っていいのでしょうか?

たとえば、
class hoge : public std::map<int,std::string>
{
・・・
};

とか。

std::vectorはデストラクタがvirtualじゃないようなので
心配になりました。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

やってもかまいません。ただし、

> std::vectorはデストラクタがvirtualじゃないようなので
> 心配になりました。

こんな心配をしなければならないような作り方/使い方さえしなければ。


返信引用
kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

>こんな心配をしなければならないような作り方/使い方さえしなければ。

どういう所に注意して作成したらいいのか、ポイントを
教えていただけたら、とてもうれしいです。

私はこんなのを作成しようと思ってました。
エラー番号からエラー文字列を返すmap。
class ErrorMap : private std::map<int, std::string>
{
private:
ErrorMap();
public
static std::string Message( int errNo );
};

ErrorMap::ErrorMap()
{
insert( std::pair< ・・・
insert( ・・・
 ・・・
}

std::string ErrorMap::Message( int errNo )
{
static ErrorMap emap;
emap.find( ・・・

return ・・・
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

std::map<int,std::tring> を ErrorMap のメンバにしちまった方が
悩みがなくて幸せではないかしら。

class ErrorMap {
std::map<int,std::string> theMap;

public:

ErrorMap() {
theMap[0] = だめ;
theMap[1] = むり;
...
}

std::string getMessage(int code) const {
std::map<int,std::string>::const_iterator iter = theMap.find(code);
assert( iter != theMap.end() );
return iter->second;
}

};


返信引用
kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

> std::map<int,std::tring> を ErrorMap のメンバにしちまった方が

なるほど!ありがとうございます。

> やってもかまいません。ただし

やっても大丈夫な使い方が、思い浮かばないのです・・・
やっぱりよくないってことですよね?

基底クラスのデストラクタが呼ばれない可能性があるってことは
例えば、基底のvecotorの値が開放されない可能性が出てくる
ってことな気がしますし、つまりはデータを入れるとまずいってことは
継承する意味がないような気がしますし。

ぅぅ。わからないぃ。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> 基底クラスのデストラクタが呼ばれない可能性があるってことは

ちがいます。
呼ばれない可能性があるのは'派生クラス'のデストラクタ。

std::map<int,std::string>* p = new ErrorMap();
delete p; // ~ErrorMap() は呼ばれない。


返信引用
kyu
 kyu
(@kyu)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

> 呼ばれない可能性があるのは'派生クラス'のデストラクタ。

はっ。確認しました。
私、どうも勘違いしてたようです。

ErrorMap* p = new ErrorMap();
delete p; // 両方呼ばれた

std::map<int,std::string>* p = new ErrorMap();
delete p; // ~ErrorMap() は呼ばれない。

派生クラスでの、メンバ変数がらみが、まずい。と。

ありがとうございました。ー> επιστημηさん


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました