C ++ Как получить доступ к пользовательскому unordered_map производного класса из указателя базового класса, указывающего на объект производного класса, без использования приведения - PullRequest
0 голосов
/ 13 мая 2019

Я разработал свои классы, как показано ниже .. Я пытаюсь получить доступ к unordered_map производного класса из указателя базового класса, указывающего на экземпляр производного класса ... Я знаю, что не могу этого сделать из-за нарезки объектов ...

Я знаю, что могу получить доступ к производной карте классов после static_casting / dynamic_casting .... -> Мне не интересен этот подход.

Но я ищу подход в форме создания абстрактного базового классасодержит одну чисто виртуальную функцию и определяет ее в производном классе, чтобы она возвращала указатель на свою карту ...

Я пытался использовать концепцию static_cast и dynamic_cast. Это работает, но я не хочу делать так.

Мой код:

class Base{

    public:

    Base(string key, string type){

        this->key = key;
        this->key_Type = type;
    }

    protected:
        string key;
        string key_Type;
};

class Derived : public Base{    

    public:
        Derived(string k, string t) : Base(k,t){}

    protected:
        unordered_map<string, Base*> my_Map;

};

int main(){

    Derived *d1 = new Derived("Id","Integer");

    Base* b = d1;

    Derived *d2 = new Derived("Name","String");

    b->my_Map.insert({"Name",d2});

        return 0;

}

Мой ожидаемый результат, так или иначе, мне нужен доступ к этой производной карте классов, чтобы я мог вставить в нее значения, например:

my_Map.insert({"Name",PointerobjectofDerivedclass})

РЕДАКТИРОВАТЬ:1 -----------------------------

Я пытался использовать чисто виртуальные функции, но мне не очень понятнокак это использовать .. Так что я закончил с большим количеством ошибок ..

Мой код:

класс Base {

public:

Base(string key, string type){

    this->key = key;
    this->key_Type = type;
}

virtual void insertmap()=0;

protected:
    string key;
    string key_Type;

};

класс Производные: общедоступная база {

public:
    Derived(string k, string t) : Base(k,t){}

    virtual void insertmap(string n , Base* obj){

        this->my_Map.insert({n,obj});

    }

protected:
    unordered_map<string, Base*> my_Map;

};

int main () {

Derived *d1 = new Derived("Id","Integer");

Base* b = d1;

Derived *d2 = new Derived("Name","String");

b->insertmap("Name",d2);

return 0;

}

Ошибки моего компилятора: В функции 'int main ()': ошибка: недопустимое новое выражение абстрактного классаtype 'Derived' Derived * d1 = new Derived ("Id", "Integer");^ note: потому что следующие виртуальные функции являются чистыми внутри 'Derived': class Derived: public Base {^ note: virtual void Base :: insertmap () virtual void insertmap () = 0;^ ошибка: недопустимое новое выражение абстрактного типа класса «Производное» Производное d2 = новое Производное («Имя», «Строка»);^ ошибка: нет соответствующей функции для вызова 'Base :: insertmap (const char [5], Derived &)' b-> insertmap ("Name", d2);^ note: кандидат: note: virtual void Base :: insertmap () virtual void insertmap () = 0;^ примечание: кандидат ожидает 0 аргументов, 2 при условии

1 Ответ

0 голосов
/ 13 мая 2019

Пройдя через много похожих ответов на вопросы, я смог стереть ошибки и успешно реализовал ...

Мой окончательный рабочий код:

класс Base {

public:

Base(string key, string type){

    this->key = key;
    this->key_Type = type;
}

virtual void insertmap(string n, Base* obj)=0;

protected:
    string key;
    string key_Type;

};

класс Производные: общедоступная база {

public:
    Derived(string k, string t) : Base(k,t){}

     void insertmap(string n , Base* obj){

        this->my_Map.insert({n,obj});

    }

    void getdetails(){

        for(auto itr = my_Map.begin();itr!=my_Map.end();++itr){

        cout<<itr->first << '\n'; 
    }
    }
protected:
    unordered_map<string, Base*> my_Map;

};

int main () {

Derived *d1 = new Derived("Id","Integer");

Base* b = d1;

Derived *d2 = new Derived("Name","String");

b->insertmap("Name",d2);

d1->getdetails();

return 0;

}

Выход: Имя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...