Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 395

Как заполнить массив объектов шаблонного класса?

22.11.2023, 20:19. Показов 895. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Sredstvo, от которого наследуются Velosiped, Avtomobil и Gruzovik. Также есть шаблонный класс для хранения указателя на объект одного из классов-наследников.

Как создать массив объектов этого шаблонного класса?
Из-за того, что класс шаблонный, массив сразу не объявляется.



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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <clocale>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
 
class Sredstvo
{
public:
    int kolvoKoles;
    string marka;
};
 
 
class Velosiped : public Sredstvo
{
public:
    float dlina_cepi;
 
    Velosiped(int a1,string a2, float a3)
    {
        kolvoKoles = a1;
        marka = a2;
        dlina_cepi = a3;
    }
 
};
 
 
class Avtomobil : public Sredstvo
{
public:
    float kolvoDverey;
 
    Avtomobil(int a1, string a2, float a3)
    {
        kolvoKoles = a1;
        marka = a2;
        kolvoDverey = a3;
    }
 
};
 
 
class Gruzovik : public Sredstvo
{
public:
    float gruzopod;
 
    Gruzovik(int a1, string a2, float a3)
    {
        kolvoKoles = a1;
        marka = a2;
        gruzopod = a3;
    }
 
};
 
 
 
 
 
template <typename T>
class Ukazateli
{
public:
    Ukazateli()
    {
 
    }
    Ukazateli(int r_d0, int r_d1, int r_d2)
    {
        reg_dokument[0] = r_d0;
        reg_dokument[1] = r_d1;
        reg_dokument[2] = r_d2;
    }
 
    int &operator[](int i)
    {
        return reg_dokument[i];
    }
 
private:
    int reg_dokument[3]{ 0, 0, 0 };
    T* sred;
 
};
 
 
int main()
{
    setlocale(LC_ALL, "Russian_Russia.1251");
 
    Ukazateli ax[6];
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2023, 20:19
Ответы с готовыми решениями:

Как создать динамический массив объектов базового класса и заполнить его наследниками базового класса?
#include &lt;iostream&gt; using namespace std; class P { int p; public: P() {

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Заполнить массив объектов базового класса
Суть задачи: есть базовый класс Участник и производные от него Студент и Школьник. Нужно заполнить массив объектов базового класса. ...

10
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
22.11.2023, 23:45
Ukazateli<нужный тип> ax[6];
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 395
23.11.2023, 06:38  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
<нужный тип>
Мне надо, чтобы в массиве типы могли быть разные.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,993
23.11.2023, 07:27
ChioraYaz, а чем указатель на базовый класс не устроил? Какая цель всех костылей ?

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <string>
#include <memory>
 
class Sredstvo
{
public:
    int kolvoKoles{};
    std::string marka;
 
    Sredstvo(int kolvoKoles,std::string marka):kolvoKoles{kolvoKoles},marka{marka}
    {
    }
    virtual ~Sredstvo()=default;
};
 
 
class Velosiped : public Sredstvo
{
public:
    float dlina_cepi{};
 
    Velosiped(int kolvoKoles,std::string marka,float dlina_cepi):Sredstvo{kolvoKoles,marka},dlina_cepi{dlina_cepi}
    {
    }
};
 
 
class Avtomobil : public Sredstvo
{
public:
    float kolvoDverey{};
 
    Avtomobil(int kolvoKoles,std::string marka,float kolvoDverey):Sredstvo{kolvoKoles,marka},kolvoDverey{kolvoDverey}
    {
    }
};
 
 
class Gruzovik : public Sredstvo
{
public:
    float gruzopod{};
 
    Gruzovik(int kolvoKoles,std::string marka,float gruzopod):Sredstvo{kolvoKoles,marka},gruzopod{gruzopod}
    {
    }
};
 
int main()
{
    std::unique_ptr<Sredstvo> ax[]
    {
        std::make_unique<Velosiped>(2,"колесо восьмёркой",2),
        std::make_unique<Avtomobil>(4,"телега плюс",5),
        std::make_unique<Gruzovik> (6,"пырчик универсал",50),
    };
 
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
23.11.2023, 08:06
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Мне надо, чтобы в массиве типы могли быть разные.
Так не бывает. В массиве, по определению, типы всегда одинаковые. Вам по-видимому нужен массив из Sredstvo *.

Цитата Сообщение от ChioraYaz Посмотреть сообщение
Как заполнить массив объектов шаблонного класса?
Что это за заголовок и о чем это вообще? Где тут хотя бы отдаленно фигурирует "массив объектов шаблонного класса"?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.11.2023, 11:12
ChioraYaz, массив шаблонных объектов это сам по себе шаблон. Шаблоны нельзя объявлять в области блока. Поэтому лучше объявить его глобально (или в пространстве имён). Чтобы не городить огород используйте шаблоны типа vector или array:
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
#include <iostream>
#include <array>
 
using namespace std;
 
template <class T>
class some_template_class
{
    public:
    some_template_class(const T & data_)
    :data(data_)
    {
 
    }
 
    T data;
};
 
int main()
{
 std::array<some_template_class<int>, 3> arr_i{1,2,3};
 for(const auto a: arr_i)
    cout <<  a.data << ' ';
    return 0;
}
Но мне кажется, что вы не того хотите, что вам нужно. Коллекция указателей на базовый класс, обычно то что нужно.
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 395
23.11.2023, 19:05  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а чем указатель на базовый класс не устроил
Задание на работу с шаблонным классом. Без него не примут.

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так не бывает
Да, сами объекты будут Ukazateli, а у них указатель уже будет на один из трёх других классов.
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,993
23.11.2023, 19:34
ChioraYaz, у меня в примере два шаблона использовано. Смело сдавай
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
24.11.2023, 05:40
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Да, сами объекты будут Ukazateli, а у них указатель уже будет на один из трёх других классов.
Ничего не понимаю. Какие еще "сами объекты будут Ukazateli"? Объект Ukazateli в вашей программе будет только один, больше не нужно.
0
-3 / 0 / 1
Регистрация: 29.03.2018
Сообщений: 395
24.11.2023, 14:44  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
будет только один
Мне нужен массив объектов этого класса.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2023, 01:37
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Мне нужен массив объектов этого класса.
ChioraYaz, если вы хотите использовать класс-обёртку над указателем, то придётся много поработать. Указатель надо инициализировать, потом удалить и пошло-поехало. А ещё конструктор копирования нужен для полноценной работы по значению, а дальше правило 5-ти... Видя ваш уровень - не советую пока связываться. Мой пример подходит для любого шаблонного класса и ничего не мешает вам создать массив не самих классов, а указателей на них:
C++
1
    std::array<*some_template_class<int>, 3> arr_;
Или смарт какой-то можно параметром сделать. Это лучше, но важен сам принцип. При этом, важно понять, что если указатели не на базовый, а на конкретный статический тип наследника, то смешивать наследников разных типов в одном контейнере будет уже нельзя. Так можно делать если не хочется потом возиться с RTTI, а необходимость активизировать различное поведение зависящее от расширенной части наследника нужно.
И ещё. Используя стандартные контейнеры типа вектор, стандартный массив и пр., вы получаете доступ к набору методов конкретного контейнера и более простое использование поддерживающих библиотек, таких как <algorithm>. Это покруче чем простой массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2023, 01:37
Помогаю со студенческими работами здесь

Хранение неинициализированных объектов шаблонного класса
Допустим, есть шаблонный класс template &lt;typename T&gt; class SomeValue; который хранит в себе какое-то значение. И есть нешаблонный...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Как правильно создать массив объектов текущего класса в методе данного класса?
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром...

Создание массива объектов шаблонного класса С++
Всем привет. В ходе выполнения работы столкнулся с потребностью в создании динамического массива объектов шаблонного класса. Но вот беда,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru