Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/34: Рейтинг темы: голосов - 34, средняя оценка - 4.50
Ko
 Аватар для Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282

Как в один вектор поместить много классов?

13.09.2014, 07:15. Показов 7637. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Есть задумка а как сделать пока не ясно.
Есть в наличии допустим много классов, в этих классах одинаковые интерфейсы ввода данных и вывода а вот логика работы абсолютно разная.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class aaa
{
int temp;
void aaa::set( int &a){ temp+=a;}
int aaa:get{return temp;}
};
 
class bbb
{
int temp;
void bbb::set( int &b){ temp-=b;}
int bbb:get{return temp;}
};
вот два класса в одном постоянно к примеру складываем а в другом вычитаем. есть мысль создать массив указателей или ссылок как там правильней и обращаться к многообразию классов через такую схему, как думаете прокатит или есть другое какое либо решение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2014, 07:15
Ответы с готовыми решениями:

Поместить экземпляры разных классов в один массив
Не пойму немного, это через List делается или иначе? Необходимо для дальнейшей сортировки и ограниченного вывода using System; using...

Хочу один системник и много-много мониторов+клавиатур+мышей. Как?
Вопрос: как реализовать возможность одновременной работы на одном системнике нескольким людям одновременно (человек 5-6), т.е. системник...

Как заполнить вектор на вектор классов
#include <iostream> #include <vector> class Num { private: int m_num; public: Num(int num) { num =...

37
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2014, 01:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ko Посмотреть сообщение
во что получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "class_base.h"
#include "class_aaa.h"
#include "class_bbb.h"
#include <vector>
 
int main()
{
    std::vector< class_base *> v;
    v.push_back(new class_aaa());
    v.push_back(new class_bbb());
 
    v[0]->set(1); // do += 1
    v[1]->set(2); // do -= 2
 
// если надо удалить все элементы, то можно так: 
    for(int i = 0, size = v.size(); i < size; ++i)
    {
        delete v[i];
    }
    v.clear();
 
    return 0;
}
Добавлено через 40 секунд
Цитата Сообщение от Ko Посмотреть сообщение
а тут у Вас ошибка ?
Писал прямо в браузере. Должен быть base*
1
Ko
 Аватар для Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
14.09.2014, 01:23  [ТС]
ну понятно что очиску контейнера можно сделать сразу же после, но у меня планируется работа с контейнером. удаление внедрение. спасибо Вам, помогли)

Добавлено через 9 минут
а это что такое в классе class_aaa() : temp() {}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.09.2014, 01:35
когда удаляется объект там что то остаётся в контейнере то) удалять можно как думаете через итератор или как его там?
Ну ведь сразу же написал класть в вектор unique_ptr. unique_ptr сам вызывает delete для хранимой в нем ссылки.
2
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2014, 01:58
Цитата Сообщение от Ko Посмотреть сообщение
а это что такое в классе class_aaa() : temp() {}
Конструктор же. И инициализация temp значением по умолчанию. В данном случае это ноль.

Если работаешь с С++11, то действительно (спасибо Renji за напоминание) лучше хранить умный указатель (std::unique_ptr) в векторе (стандартный умный указатель, который можно положить в вектор появился только в С++11).
1
Ko
 Аватар для Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
14.09.2014, 03:40  [ТС]
спасибо, сразу не признал конструктор то)))

Добавлено через 53 минуты
такое std::vector< std::unique_ptr <class_base> * > v; и такое std::vector< std::unique_ptr * > v;
у меня не прокатывает, как правильно ребята?

Добавлено через 10 минут
вот так std::unique_ptr < class_base > v; не подчёркивает, а как вставлять?

Добавлено через 24 минуты
вот так тоже нормально std::vector < std::unique_ptr < class_base > > v;
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.09.2014, 05:57
Лучший ответ Сообщение было отмечено Ko как решение

Решение

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
#include <iostream>
#include <vector>
#include <memory>
 
class class_base
{
public:
    virtual void f() = 0;
};
 
class A : public class_base
{
    virtual void f()
    {
        std::cout << "class A" << std::endl;
    }
};
 
class B : public class_base
{
    virtual void f()
    {
        std::cout << "class B" << std::endl;
    }
};
 
 
int main()
{
    std::vector <std::unique_ptr<class_base> > v;
    
    v.emplace_back(new A);
    v.emplace_back(new B);
    
    for (auto& i : v)
        i ->f();
        
    system("pause");
    return 0;
}
Миниатюры
Как в один вектор поместить много классов?  
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2014, 12:15
Цитата Сообщение от Ko Посмотреть сообщение
вот так тоже нормально std::vector < std::unique_ptr < class_base > > v;
Это и правильно. См. ответ alsav22.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.09.2014, 12:26

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И после таких изречений лишь меня банят за брань на форуме
Вероятно по тому что только ты не прав, и я лично тоже не понимаю зачем там dynamic_cast<>, почему сразу не грубый каст от void* к типу ?
Может для то что бы показать что он выводит ошибку при неправильном касте? Так вроде задача так не стояла.



Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Если работаешь с С++11, то действительно (спасибо Renji за напоминание) лучше хранить умный указатель (std::unique_ptr) в векторе (стандартный умный указатель, который можно положить в вектор появился только в С++11).
Но можно использовать boost::shared_ptr<>

0
14.09.2014, 12:37

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Но можно использовать boost::shared_ptr<>
А еще можно использовать boost :: ptr_vector, про который я уже упоминал.
Но беда в том, что автор не знает как использовать boost:: :)

0
Ko
 Аватар для Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
16.09.2014, 03:40  [ТС]
да я просто пишу софт который скорей всего будет нужно запускать на процессорах tilera а там свой компилятор и что он там насчёт boost:: скажет не известно в дальнейшем.

Добавлено через 38 секунд
Всем спасибо, поставленную задачу решили!!!

Добавлено через 2 часа 29 минут
C++
1
2
3
4
5
6
    for (auto i(0); i < v.size(); i++ )
    {
        v[i]->f();
        v.erase(v.begin()+i);
        i--;
    }
как думаете такая схема удаления объектов из вектора нормальная? кстати когда я удаляю из вектора то конечно объект само уничтожается и не надо delete писать как предыдущем примере писали.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.09.2014, 05:11
Цитата Сообщение от Ko Посмотреть сообщение
как думаете такая схема удаления объектов из вектора нормальная?
Можно по разному:
C++
1
2
3
4
5
while (!v.empty())
{
    (*v.begin()) ->f();
    v.erase(v.begin());
}
Можно просто сделать (после цикла с вызовом f()):
C++
1
v.clear();
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.09.2014, 11:22
Ko, просто используй итераторы, а не индексы

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
v.clear();
Кстати куда эффективнее чем каждый раз делать сдвиг и лишнее копирование.
0
16.09.2014, 11:28

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
чем каждый раз делать сдвиг и лишнее копирование.
Можно просто с конца удалять

0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
16.09.2014, 12:00
Цитата Сообщение от Ko Посмотреть сообщение
как думаете такая схема удаления объектов из вектора нормальная?
Строго говоря нет. Если хотите полностью затереть вектор используйте "фокус с перестановкой":
C++
1
2
3
{
    std::vector <std::unique_ptr<class_base> >().swap(v);
}
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 12:02
Цитата Сообщение от Ilot Посмотреть сообщение
"фокус с перестановкой"
который в C++11 уже не нужен (std::vector::shrink_to_fit)
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
16.09.2014, 12:06
Tulosba, енто почему? Коли моя старческая память мне не изменяет shrink_to_fit освобождает не занятую память, а не как не урезает вектор.
0
16.09.2014, 12:17

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
shrink_to_fit освобождает не занятую память, а не как не урезает вектор.
Согласен. Немного о другом подумал.

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.09.2014, 17:13
Цитата Сообщение от Ko Посмотреть сообщение
что то меня динамик каст как то напрягает если честно
Для виртуальных методов, как сказали, не нужно. А для не виртуальных, независимо от того есть такие же имена в базовом или нет, - нужно. То есть для расширяющих (которых нет) и переопределённых (которые есть, но переопределены). В общем случае, вызывать такие вещи из контейнера базовых указателей, скорее всего плохо. Как сказали, - ошибка проектирования. Хотя это и возможно, в принципе.
Цитата Сообщение от Ko Посмотреть сообщение
когда удаляется объект там что то остаётся в контейнере то
В контейнере остаются копии значений типа. В случае с простыми указателями - значения указателей. Они уничтожатся вместе с контейнером и ничего специально делать ненужно, а вот память на которую они указывают освободить надо, то есть пробежать по вектору и и запустить delete для каждого указателя. Это и вызовет, ещё деструктора для каждого объекта, обеспечивая деинициализацию. Вот почему нужны виртуальные деструкторы в этом случае. Для каждого свой запустится.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.09.2014, 17:13

Много методов или много классов. Что лучше?
Имеется библиотека(ActiveX DLL), в которую, в своё время, было решено складировать функции, вызваемые извне(точнее, основным модулем)....

Как поместить библиотеку классов в программу
У меня есть программка, которая работает через определённую библиотеку классов, но если запустить программу эту в папке где не лежит данная...

Как поместить в STL-контейнер экземпляры разных классов?
Как поместить в контейнер экземпляры разных классов(типов) :thank_you:?

Как вектор столбец поместить в одну ячейку через запятую?
Доброе время суток! Помогите, пожалуйста разобраться. Два вопроса. 1(основной): Как вектор столбец поместить в одну ячейку через...

Как отсортировать вектор классов?
Мне нужно пузырьковой сортировкой отсортировать вектор разнородных классов по 2 общим полям. Алгоритм сортировки я знаю, вот только не знаю...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru