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

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

Войти
Регистрация
Восстановить пароль
 
Matrasa
0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 40
#1

std::list<T*> вызвать метод - C++

20.01.2013, 21:20. Просмотров 619. Ответов 7
Метки нет (Все метки)

Как во время просмотра MyList вызвать метод Show() каждого обьекта?

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
class MyVehicle
{
    public:
    virtual void Show() { /* ... */ }
};
 
class MyCar : public MyVehicle
{
    public:
    void Show() { /* ... */ }
};
 
int main()
{
 
std::list<MyVehicle*> MyList;
MyCar mc;
MyVehicle *mv = &mc;
MyList.push_back(mv);
 
std::list<MyVehicle*>::iterator iter = MyList.begin();
 
//Просматриваем MyList
for(int i = 0; i < MyList.size(); i++)
{
    //iter.Show();
    //iter->Show();
    //*iter->Show();
    //(*iter)->Show();
    //Как вызвать метод Show()??
    iter++;
}
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 21:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::list<T*> вызвать метод (C++):

Реализация std::list, сложность list::size() - C++
Часто приходилось пользоваться Listом, но сейчас столкнулся с небольшой неоднозначностью. Согласно документации, метод size() в 11...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') - C++
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...

Сортировка std::list - C++
Есть такой фрагмент програми. Создаю функцию для сортировки list. Вроде все правильно. В класе перегружены оператори &lt; i =. Не знаю что...

Static std::list - C++
Добрый день, помогите решить проблему. &quot;Каждое статическое поле должно быть проинициализировано до main() явным образом&quot; - как я помню...

Вопрос по std::list - C++
Не произойдёт ли здесь какая-нибудь ошибка после удаления элемента из списка? std::list&lt;int&gt; myList; std::list&lt;int&gt;::iterator iter; ...

7
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
20.01.2013, 21:29 #2
C++
1
(*iter)->Show();
1
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
20.01.2013, 21:35 #3
А в чем была проблема попробовать каждый из написанных тобою же вариантов, если уж не знаешь, как нужно?
0
Matrasa
0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 40
20.01.2013, 23:07  [ТС] #4
Croessmah, Не работает. Вот, для примера такой код, и он не работает (программа запускается и ничего не выводит)

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
#include <iostream>
#include <list>
 
class MyVehicle
{
    public:
    virtual void Show() {}
};
 
class MyCar : public MyVehicle
{
    public:
    void Show() {std::cout << "I'm a car!\n"; }
};
 
int main()
{
    std::list<MyVehicle*> MyList;
    MyCar mc;
    MyVehicle* mv = &mc;
 
    std::list<MyVehicle*>::iterator iter = MyList.begin();
 
    for(int i = 0; i < MyList.size(); i++)
    {
        (*iter)->Show(); iter++;
    }
}
ЗЫ. Код пишу под виндой в QtCreator.

Добавлено через 48 секунд
Герц, Я их все попробовал. Ни один не сработал.

Добавлено через 6 минут
Croessmah, А нет, все работает, забыл обьект закинуть в список. Спасибо за ответ!

Добавлено через 56 минут
Чейто я не пойму, предыдущий код работает, а вот такой сегфолтится. Помогите разобраться пожалуйста

C++ (Qt)
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
43
44
45
46
47
48
49
50
#include <QtCore/QCoreApplication>
#include <list>
#include <iostream>
 
class MyVehicle
{
    public:
    virtual void Show() {}
};
 
class MyCar : public MyVehicle
{
    public:
    void Show() {std::cout << "I'm a car!\n"; }
};
 
class MyList
{
public:
    void AddCar()
    {
        MyCar mc;
        MyVehicle* mv = &mc;
        MyListOfVehicles.push_back(mv);
    }
 
    void PrintList()
    {
        std::list<MyVehicle*>::iterator iter = MyListOfVehicles.begin();
 
        for(int i = 0; i < MyListOfVehicles.size(); i++)
        {
            (*iter)->Show();
            iter++;
        }
    }
 
    std::list<MyVehicle*> MyListOfVehicles;
};
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    MyList ml;
    ml.AddCar();
    ml.PrintList();
 
    return a.exec();
}
Добавлено через 19 минут
Хмм, работает если я не создаю экземпляр MyCar внутри метода MyList, а передаю из main() в качестве параметра...
0
prZzZ
Программист
112 / 92 / 5
Регистрация: 22.03.2011
Сообщений: 235
20.01.2013, 23:15 #5
Matrasa, добрый вечер...
Про алгоритмы ничего не слышали?
C++
1
2
3
4
5
6
template<class InputIterator, class Function>
   Function for_each(
      InputIterator _First, 
      InputIterator _Last, 
      Function _Func
   );
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
20.01.2013, 23:18 #6
Цитата Сообщение от Matrasa Посмотреть сообщение
C++
1
2
3
4
5
6
void AddCar()
{
    MyCar mc;
    MyVehicle* mv = &mc;
    MyListOfVehicles.push_back(mv);
}
mc в данном случае это локальная переменная. После того как метод отработает переменная выходит из области видимости и указатель на эту переменную становится недействительным.
1
Matrasa
0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 40
21.01.2013, 00:06  [ТС] #7
rangerx, Чейто я ступил, в самом же деле, после того как функция отработает mv указывает хрен знает куда!
0
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,139
21.01.2013, 05:12 #8
C++
1
2
3
4
5
6
7
8
9
10
void PrintList()
{
    std::list<MyVehicle*>::iterator iter = MyListOfVehicles.begin();
 
    for(int i = 0; i < MyListOfVehicles.size(); i++)
    {
        (*iter)->Show();
        iter++;
    }
}
Ну если уж выводим в цикле и начали использовать итераторы, то давайте уж до конца...
C++
1
2
3
4
5
6
7
8
void PrintList()
{ 
    for (std::list<MyVehicle*>::iterator it = MyListOfVehicles.begin(),
        end = MyListOfVehicles.end(); it != end; ++it)
    {
        (*it)->Show();
    }
}
0
21.01.2013, 05:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2013, 05:12
Привет! Вот еще темы с ответами:

Вопросы по std::list - C++
1. Как обменять в списке два его элемента? Желательно большое быстродействие :) т.е. без удалить оба а потом добавить в другом порядке,...

Передача std::list<> в функцию - C++
Нужно передать список строк в функцию. У меня сделано так: void f(list&lt;string&gt;&amp; list1) {...} т.е. по ссылке передаю ...

Удаление значения в std::list - C++
Имеем метод для удаления, где value - предов. значение, а list&lt;films&gt; coll - копия др. списка(который уже наполнен данными). ...

Непосредственное удаление из std::list - C++
Собственно проблема вот в чем раньше, когда я создавал игру, у меня были самодельные листы типа struct List { T data; ...


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

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

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