CodersSC
CodersSC

Reputation: 710

map inheritance

I have a parent class which holds a map and n the child class i have used to inherit that class with for some reason can't access the map which i can't under stand why, i want to access the values inside the map.

my code is as follows

//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?'

output is nothing but i need to acces the map fron the parent class, what am i doing wrong?

any help i will be very gratefull

Thanks

Upvotes: 0

Views: 160

Answers (2)

Mike Seymour
Mike Seymour

Reputation: 254471

Does the map contain an entry for 'D' when you call transLateMask()? You'll get undefined behaviour (perhaps a runtime error) if it doesn't, since you don't check the result of find(). Something like this would be more robust:

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;

(If you're not using C++11, then replace auto with the full type name, std::map<char,std::string>::const_iterator).

Alternatively, C++11 adds an at() method which throws std::out_of_range if the key is not found:

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

Upvotes: 1

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84169

The find() method of the std::map can return an iterator that is "one beyond the end" of the map, i.e. equals to result of end(). This means there's no such entry in the map. You have to check for that:

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 {
    ...
}

Upvotes: 1

Related Questions