наследование карты - PullRequest
       4

наследование карты

0 голосов
/ 12 января 2012

У меня есть родительский класс, который содержит карту, и 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?'

вывод ничего, но мне нужно получить доступ к карте родительского класса, что я делаю не так?

любая помощь, я буду очень благодарен

Спасибо

Ответы [ 2 ]

1 голос
/ 12 января 2012

Содержит ли карта запись для '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;
1 голос
/ 12 января 2012

Метод find() в std::map может возвращать итератор, который "один за концом" карты, то есть равен результату 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 {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...