Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27
1

Как динамически создать стандартный контейнер данных с элементами такого же типа, как полученный экземпляр?

10.04.2020, 17:30. Показов 1353. Ответов 8

Author24 — интернет-сервис помощи студентам
Всем привет! Имеет интерфейс и его реализация. Необходимо, чтобы в классе SomeActiv в его методе создавался вектор, элементы которого были такого же типа, как и полученный экземпляр класса. Как это реализовать?

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 <vector>
 
#include <typeinfo>
 
class Getter {
public:
    virtual int get() = 0;
};
 
class GetOne : public Getter {
public:
    int get() override {
        return 1;
    }
};
 
 
class GetTwo : public Getter {
public:
    int get() override {
        return 2;
    }
};
 
 
class SomeActiv {
public:
    void someActiv(Getter const&instance) {
 
        std::vector<typeid(instance)??> vect(10);
                //...
    }
};
 
 
int main()
{
    SomeActiv sa;
    GetTwo gt;
    sa.someActiv(gt);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2020, 17:30
Ответы с готовыми решениями:

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

Как создать экземпляр класса динамически?
Здравствуйте, уважаемые! Существует пустая форма. Мне надо динамически, по нажатию кнопки,...

Как создать экземпляр класса динамически?
добрый вечер всем, в c# я новичок поэтому сильно не ругайте за глупый вопрос есть ряд классов...

Класс как стандартный контейнер
Здорова господа! Опять есть условие задачи: Напишите такие классы, чтобы Vector из 16.2.1 и...

8
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
10.04.2020, 19:14 2
Указатель или шаблон.
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,306
10.04.2020, 21:07 3
decltype

Добавлено через 1 минуту
и вот это понадобится )) std::remove_refrence
1
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.04.2020, 21:23 4
Лучший ответ Сообщение было отмечено Patifon_Kakao как решение

Решение

Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
Как это реализовать?
паттерн clone



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
#include <vector>
 
class Getter {
public:
    virtual int get() = 0;
    virtual ~Getter() {}
    virtual Getter* clone() const = 0;
};
 
class GetOne : public Getter {
public:
    int get() override { return 1; }
    virtual GetOne* clone() const { return new GetOne; }
};
 
 
class GetTwo : public Getter {
public:
    int get() override { return 2; }
    virtual GetTwo* clone() const { return new GetTwo; }
};
 
 
class SomeActiv {
public:
    void someActiv(Getter const& instance) {
 
        std::vector<Getter*> vect;
        vect.emplace_back(instance.clone());
    }
};
 
 
int main()
{
    SomeActiv sa;
    GetTwo gt;
    sa.someActiv(gt);
}
1
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27
14.04.2020, 13:52  [ТС] 5
Цитата Сообщение от hoggy Посмотреть сообщение
паттерн clone
Не будет ли происходить в этом случае утечки памяти? Особенно если использовать следующим образом:
C++
1
2
3
4
std::vector<Getter*> vect(size);
    for (auto i = 0; i < size; ++i) {
        vect[i] = instance.clone();
    }
Ведь при выходе будет вызван только деструктор вектора, если я правильно понимаю.
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,306
14.04.2020, 13:54 6
Patifon_Kakao, конечно будет утечка, временем жизни экземпляров нужно управлять, раз создаёшь их на куче.

Либо использовать std::shared_ptr или самописные вропперы
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.04.2020, 14:57 7
Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
Ведь при выходе будет вызван только деструктор вектора, если я правильно понимаю.
правильно понимаешь.

перед разрушением вектора, нужно почистить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
std::vector<Getter*> vect(size);
 
// заполняем
    for (auto i = 0; i < size; ++i)
        vect[i] = instance.clone();
 
// пользуемся
    for (auto* ptr: vec)
        ptr->work();
 
// зачищаем
    for (auto* ptr: vec)
        delete ptr;
ещё можно использовать вектор умных указателей.

например:
C++
1
std::vector<std::shared_ptr<Getter> > vect(size);
тогда ничего чистить не нужно.
vector и shared_ptr сами о себе позаботятся
1
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27
14.04.2020, 18:53  [ТС] 8
Цитата Сообщение от hoggy Посмотреть сообщение
ещё можно использовать вектор умных указателей
Насколько я понимаю, корректна именно такая инициализация вектора.
C++
1
2
3
4
5
std::vector<std::unique_ptr<Getter>> vect(size);
    for (auto i = 0; i < size; ++i) {
        std::unique_ptr<Getter> ptr(instance.clone());
        vect[i] = std::move(ptr);
    }
А если реализовывать еще более безопасно, то необходимо возвращать умный указатель прямо из clone?
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.04.2020, 18:58 9
Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
А если реализовывать еще более безопасно, то необходимо возвращать умный указатель прямо из clone?
в идеале - да.
тогда можно будет написать: vect[i] = instance.clone();
и не заморачиваться.
0
14.04.2020, 18:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2020, 18:58
Помогаю со студенческими работами здесь

Как создать динамически расширяемый массив объектов пользовательского типа (структура User)?
Здравствуйте, нужна ваша помощь с структурой ... Bот у меня пользователей при регистрации может...

Как найти количество элементов в списке (Tlist), если переменная такого типа объявлена как private?
Друзья! Вот есть такой класс, не мой, я щас в нём ковыряюсь, он большой, я поубирал все ненужные на...

Как динамически создать массив из динамически конструируемых экземпляров класса?
Есть два класса.Подразумевается ,что первый в конструкторе выделяет интовый массив длинной n,второй...

Как удалить какой-либо элемент (Button, ComboBox etc.) динамически созданный и помещенный в контейнер
Доброго всем времени суток. Подскажите, пожалуйста, как удалить Вот была создана кнопка: ...

Динамически создать экземпляр объекта, тип которого передан функции
Здравствуйте, дорогие коллеги. Прошу вашей компетентной помощи, может быть кто-то сталкивался с...

Как работать с данными такого типа
Очень часто встречаю данные подобного хранящиеся в таком виде Например поле в котором данные...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru