Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maxm
62 / 34 / 8
Регистрация: 17.07.2014
Сообщений: 456
#1

Класс: как обратиться к методу производного класса через итератор на базовый класс? - C++

03.12.2015, 23:29. Просмотров 393. Ответов 11
Метки нет (Все метки)

Есть абстрактный и два порожденных.
Хочу создать например
C++
1
list<Base*> list1;
затем добавляю себе в список:
C++
1
2
list1.push_back(new(Deriv1));
list1.push_back(new(Deriv2));
тогда итератором прохожу по списку:
C++
1
2
for (list<Base>::iterator it = list1.begin(); it != list1.end(); ++it)
 it->method1();
Пишет что класс итератор бла бла бла не содержит такого метода.
Вопрос: как обратиться к методу производного класса через итератор на базовый класс?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2015, 23:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс: как обратиться к методу производного класса через итератор на базовый класс? (C++):

Вызов метода производного класса через указатель на базовый класс - C++
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при выполнении выражения c-&gt;fnz() ...

Указателю на базовый класс присвоить адрес производного класса - C++
class Point { public: Point(float a=0, float b=0) { x=a; y=b; } protected: float x; float y; };

Присвоение указателю на базовый класс адреса производного класса - C++
Когда наследую как public,всё норм,как private - ошибка. Как сделать тогда,чтобы открылся конструктор? Base :: Base(); Не помогает ...

Как инициализировать элементы данных производного класса через базовый? - C++
есть базовый клас у него есть производный(открытое наследование), как инициализировать элементы-данных производного класа через базовый? ...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Разработать производный от абстрактного класса Figure класс и класс, производный от производного - C++
Разработать базовый абстрактный класс Figure с пустым виртуальным методом print для вывода в дальнейшем полной информации об объекте: ...

11
-L
15 / 9 / 10
Регистрация: 03.12.2015
Сообщений: 79
03.12.2015, 23:45 #2
maxm,

тип того?

C++
1
2
3
Base* bd = new Derived();
Derived* pd = dynamic_cast<Derived*>(bd);
pd->some_method();
0
maxm
62 / 34 / 8
Регистрация: 17.07.2014
Сообщений: 456
03.12.2015, 23:50  [ТС] #3
Тип да, но что делать с итератором? Он не позволяет так записать
0
-L
15 / 9 / 10
Регистрация: 03.12.2015
Сообщений: 79
04.12.2015, 00:11 #4
maxm,

в чём трабл-то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <list>
 
using namespace std;
 
class Base
{
public:
    virtual void do_something_abstract() = 0;
};
 
class Derived : public Base
{
public:
    void do_something_real() { std::cout << "Ok"; };
    void do_something_abstract() override { return; };
};
 
int main()
{
    std::list<Base*> list1;
 
    list1.push_back(new(Derived));
    list1.push_back(new(Derived));
 
    for (auto it = list1.begin(); it != list1.end(); ++it)
    {
        Derived* p = dynamic_cast<Derived*>(*it);
        p->do_something_real();
    }
 
    cin.get();
    return 0;
}
0
maxm
62 / 34 / 8
Регистрация: 17.07.2014
Сообщений: 456
04.12.2015, 00:20  [ТС] #5
Меня интересует как вызвать через итератор что либо вообще? Подчеркивает, пишет что не такой синтаксис либо что нет такого члена в класе итератор, хотя мне нужен мой клас и мои члены
Например у меня если вложенные член - список, и я иду по цыклу внешнем по обьектам класса Base и внутренним каждый раз еще бегу по листу. Так вот такое неверно, не могу обратится к методу:

C++
1
2
3
4
list<Client*> clients;
list<Property*> clients;
for (list<Client>::iterator it = clients.begin(); it != clients.end(); ++it)
        for (list<Property>::iterator jt = it->properties.begin(); jt != it->properties.end(); ++jt)
Клиент - это класс, в нем есть лис properties.
Как тут записать?
Подчеркивает итераторы все, если сделаю без указателя. то есть так обьявлю, то все нормально:
C++
1
2
list<Client> clients;
list<Property> clients;
0
-L
15 / 9 / 10
Регистрация: 03.12.2015
Сообщений: 79
04.12.2015, 00:31 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <list>
 
class Derived;
 
class Base
{
public:
    virtual void do_something_abstract() = 0;
    std::list<Derived*> properties;
};
 
class Derived : public Base
{
public:
    void do_something_real() { std::cout << "Ok"; };
    void do_something_abstract() override { return; };
};
 
int main()
{
    std::list<Base*> list1;
 
    list1.push_back(new(Derived));
 
    for (auto it = list1.begin(); it != list1.end(); ++it)
    {
        Derived* p = dynamic_cast<Derived*>(*it);
        p->do_something_real();
    }
 
    for (auto it = list1.begin(); it != list1.end(); ++it)
    {
        for (auto jt = (*it)->properties.begin(); jt != (*it)->properties.end(); ++jt)
        {
            //do_something
        }
    }
 
    std::cin.get();
    return 0;
}
0
Kerry_Jr
Модератор
Эксперт PHP
2206 / 2002 / 701
Регистрация: 14.05.2014
Сообщений: 5,867
Записей в блоге: 1
Завершенные тесты: 5
04.12.2015, 00:33 #7
Цитата Сообщение от maxm Посмотреть сообщение
list<Base>::iterator
Цитата Сообщение от maxm Посмотреть сообщение
list<Base*> list1;
а ничего что типы не совпадают?
0
maxm
62 / 34 / 8
Регистрация: 17.07.2014
Сообщений: 456
04.12.2015, 00:33  [ТС] #8
А без auto как?
0
-L
15 / 9 / 10
Регистрация: 03.12.2015
Сообщений: 79
04.12.2015, 00:39 #9
Порнуха какая-то получилась. Класс отнаследован и содержится в родительском. Либо я не понимаю, что Вам конкретно нужно, либо Вы не знаете)
0
maxm
62 / 34 / 8
Регистрация: 17.07.2014
Сообщений: 456
04.12.2015, 00:42  [ТС] #10
Нет, в классе содержится другой, не наследованый от него
0
-L
15 / 9 / 10
Регистрация: 03.12.2015
Сообщений: 79
04.12.2015, 00:43 #11
maxm,

Покатит?

C++
1
2
3
4
5
6
7
8
    
for (std::list<Base*>::iterator it = list1.begin(); it != list1.end(); ++it)
{
        for (std::list<Derived*>::iterator jt = (*it)->properties.begin(); jt != (*it)->properties.end(); ++jt)
        {
            //do_something
        }
    }
0
maxm
62 / 34 / 8
Регистрация: 17.07.2014
Сообщений: 456
04.12.2015, 00:46  [ТС] #12
Все, догнал свой затуп... тип итератора неправильно давал
Спс
0
04.12.2015, 00:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2015, 00:46
Привет! Вот еще темы с ответами:

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения - C++
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;typeinfo&gt; using...

Как управлять наследниками через базовый класс - C++
Всем привет)Есть вот одна проблема. Хочу управлять объекты через другие объекты. Допустим есть базовый класс class base { ...

Как при помощи указателя на базовый класс обратится к полю наследуемого класса? - C++
Всем привет! столкнулся с такой проблемой. У меня есть массив указателей на базовый виртуальный класс,и например я присваиваю указателю на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru