2012-01-12 18 views
0

私はマップを保持する親クラスを持っています。そして、何らかの理由でそのクラスを継承するために使用した子クラスは、私がなぜ立つことができないのですか?マップ内の値。map継承

//HEADER FILE 
#include <iostream> 
#include <map> 
using namespace std; 

//////PARENT CLASS 
struct TTYElementBase 
{ 
    //some code here 
}; 

class element 
{ 
    public: 

     std::map<char,std::string> transMask; 
     std::map<char,std::string>::iterator it; 

     void populate(); 
}; 

//////CHILD CLASS .HPP 

class elementV : public element 
{ 
public : 
    std::string s1; 
    std::string s2; 
    elementV(); 
    friend ostream &operator<< (ostream &, const elementV &); 
    void transLateMask(); 
}; 

//CPP FILE 
#include "example.h" 
#include <iostream> 

elementV::elementV() 
{ 
} 

void elementV::transLateMask() 
{ 
    for (it=transMask.begin() ; it != transMask.end(); it++) 
     cout << (*it).first << endl; 
} 

int main() 
{ 
    elementV v; 
    v.transLateMask(); 
} 

// ' OUTPUT IS NOTHING I DONT KNOW WHY?' 

出力は何もありませんが、私は親クラスフロンマップをアクセスもする必要があり、私は間違って何をやっているの?次のように私のコードがありますか

任意のヘルプ、私は非常にgratefullなり

おかげ

+0

プログラムをコンパイルしますが、実行時に失敗しましたか? – hmjd

+1

マップに「D」で索引付けされたエントリがありますか? –

+0

マップの表示方法を表示できますか? 'D'が存在しない場合は、未定義の振る舞いであるpast-the-endイテレータを参照しています。 – hmjd

答えて

1

あなたがtransLateMask()を呼び出すときにマップが'D'のエントリが含まれていますか? find()の結果をチェックしないので、未定義の動作(おそらくランタイムエラー)が発生します。このような何かをより堅牢になります:

auto found = transMask.find('D'); 
if (found == transMask.end()) { 
    // handle the error in some way, perhaps 
    throw std::runtime_error("No D in transMask"); 
} 

std::string str = found->second; 

(あなたがC++ 11を使用していない場合は、完全なタイプ名を持つ autostd::map<char,std::string>::const_iteratorを交換してください)。

また、C++ 11の鍵が見つからない場合std::out_of_rangeをスローat()メソッドを追加します。

std::string str = transMask.at('D')->second; 
+0

はい'transMask ['D'] =" [0-9] "' – CodersSC

+0

そして、 'transLateMask'を呼び出す前に必ず*配置されていますか?その場合、コードに何らかの問題がありますあなたは私たちを示していません;問題を示すための短い、完全なプログラムを投稿できますか? –

+0

完全なプログラムは上記です – CodersSC

1

std::mapfind()方法は、すなわちend()結果に等しく、マップの「端部を越え1」であるイテレータを返すことができます。これは、そのようなエントリがマップにないことを意味します。あなたはそれをチェックする必要があります。

typedef std::map<char,std::string> mymap; 
mymap::const_iterator i = transMask.find('D'); 

if (i == transMask.end()) { 
    std::cerr << "'D' not found" << std::endl; 
} else { 
    ... 
} 
+0

はいマップにはDがあります。マップはこのように 'transMap ['D'] =" [0-9] 'のように設定されています@Nikolai N Fetissov – CodersSC

+0

'// HEADER FILE' – CodersSC