2012-01-12 78 views
0

我有一個父類,它擁有一張地圖,並且n我用來繼承該類的子類因爲某些原因無法訪問我不能支持的地圖爲什麼我想訪問地圖內的值。地圖繼承

我的代碼如下

//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 2012-01-12 17:09:01

+1

地圖是否有一個由「D」標記的條目? – 2012-01-12 17:10:07

+0

你能說明地圖是如何填充的嗎?如果'D'不存在,那麼你正在引用一個過去末端的迭代器,這是未定義的行爲。 – hmjd 2012-01-12 17:14:18

回答

1

是否在地圖包含'D'條目,當你調用transLateMask()?如果沒有定義的行爲(可能是運行時錯誤),您將不會檢查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,然後更換auto有完整的類型名稱,std::map<char,std::string>::const_iterator)。

可選地,C++ 11增加了一個at()方法,其拋出std::out_of_range如果密鑰未發現:

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

yes there是地圖中的D,地圖看起來像這樣'transMask ['D'] =「[0-9]」' – CodersSC 2012-01-12 17:55:16

+0

而且在調用'transLateMask'之前它肯定被填充*在這種情況下,代碼中存在一些問題你沒有向我們展示;你能發佈一個簡短的完整程序來演示這個問題嗎? – 2012-01-12 17:57:56

+0

完整的程序在上面 – CodersSC 2012-01-12 21:34:24

1

std::mapfind()方法可以返回一個迭代,即「一個超越到底」的地圖,即等於導致的end()。這意味着地圖中沒有這樣的條目。你要檢查的是:

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 2012-01-12 17:54:36

+0

'// HEADER FILE' – CodersSC 2012-01-12 21:28:01