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

Создать единый класс с шаблонными векторами

30.03.2014, 23:59. Показов 905. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые. Возник 1 вопрос при написании шаблонного класса: как сделать так, чтоб при создании объекта класса конструктор сразу же "вставлял" новый элемент в соответствующий вектор (функция push_back() без параметра в конструкторе, если такое возможно):
C++
1
2
3
4
5
6
7
8
9
10
template<class T, class U> class Pair {
private:
    T first;
    U second;
public:
    Pair(T some_first, U some_second): first(some_first), second(some_second) { /* функция push_back */  }
    T& get_first() { return first; }
    U& get_second() { return second; }
    vector<Pair<T,U>> vec; // целевой вектор;
};
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.03.2014, 23:59
Ответы с готовыми решениями:

Создать класс, для работы с динамическими векторами
Создать класс, для работы с динамическими векторами, длины n. В класс реализовать операцию вычитания векторов ввода и вывода в поток....

Единый базовый класс для всех производных
Здравствуйте! У меня есть два класса - базовый (Base) и производный (Child). В начале я создаю объект класса Base - b и вывожу его адрес (в...

Как создать единый файл
Уважаемые, кто знает - подскажите! Как создать независимое приложение и собрать все рабочие файлы в один exe, чтобы программа могла...

14
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:02
Цитата Сообщение от Sentipar Посмотреть сообщение
C++
1
vector<Pair<T,U>> vec; // целевой вектор;
Пока все это странно выглядит. Вектор именно внутри Pair?
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:04  [ТС]
Да я знаю. Я просто хочу, чтоб при инициализации нового объекта Pair, этот объект записывался в соответствующий вектор.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:12
Sentipar, так если вектор внутри Pair, то даже если сделать запись туда, то в нем всегда будет один элемент. Нужно именно такое поведение?
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:15  [ТС]
Ага, вот теперь до меня дошло. Нет, не совсем, задумка была в том, чтоб записывать в вектор разные пары значений. Но вот теперь я понял насколько это глупо. Лучше определить вектор вне класса и записывать туда значения, не так ли?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:16
Цитата Сообщение от Sentipar Посмотреть сообщение
Лучше определить вектор вне класса и записывать туда значения, не так ли?
Да, именно так.
Хотя если интересно я могу дать ответ и на первоначальный вопрос:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class T, class U>
class Pair {
private:
    T first;
    U second;
public:
    Pair(T some_first, U some_second): first(some_first), second(some_second) { vec.push_back(*this); }
    T& get_first() { return first; }
    U& get_second() { return second; }
    vector<Pair<T,U>> vec;
};
1
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:18  [ТС]
Я почему то так и думал, но побоялся использовать (*this) ибо не знал до конца, к чему приведёт эта конструкция. Спасибо.

Если я хочу при создании идентичных объектов класса Pair записывать их в вектор мне нужно определить вектор вне класса и в конструкторе класса задействовать описанную вами конструкцию?
C++
1
 vec.push_back(*this);
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:25
Цитата Сообщение от Sentipar Посмотреть сообщение
Я почему то так и думал, но побоялся использовать (*this)
Правильно побоялся. Здесь могут быть нежелательные сайдэффекты.

Цитата Сообщение от Sentipar Посмотреть сообщение
Если я хочу при создании идентичных объектов класса Pair записывать их в вектор мне нужно определить вектор вне класса и в конструкторе класса задействовать описанную вами конструкцию?
Не совсем. Например так:
C++
1
vec.push_back(Pair<int, int>(1, 1));
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:28  [ТС]
Это я понимаю, но есть ли вариант, при котором мне не нужно писать каждый раз функцию push_back()? Т.е. класс Pair будет автоматически вписывать однородные объекты при заданном векторе?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:31
Sentipar, не совсем ясно зачем это может понадобиться делать? Опиши лучше свою задачу, чтобы мне не гадать и потенциально правильный совет дать.
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:34  [ТС]
DrOffset, Задача примерно состоит в том что нужно сделать таблицу пар любых допустимых типов ("Имя - значение") и затем записать их в вектор для вывода на экран.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:41
Sentipar, так ведь вектор сам может служить такой таблицей. Даже если таблица - это сторонний объект, то записывать ее в вектор только для того, что бы вывести на экран тоже не нужно. Можно ведь сразу это (выводит на экран) делать, напрямую из таблицы. В конце концов, если таблица - это родитель вектора, то можно сделать метод у нее, который сгенерирует нужный вектор из элементов таблицы.

Цитата Сообщение от Sentipar Посмотреть сообщение
Т.е. класс Pair будет автоматически вписывать однородные объекты при заданном векторе?
Нет никаких причин возлагать эту ответственность на класс Pair. Это походит на то, что вот родился ребенок и сам тут же выбрал себе имя, место работы и все остальное. Но в реальной жизни всем очевидно, что это вне зоны его ответственности. Почему здесь должно быть иначе?
Однако есть задачи, где может потребоваться регистрировать созданные объекты в каком-то глобальном контейнере. И можно эту регистрацию проводить из самого объекта. Но это требует наложения определенных условий на способ создания таких объектов. При такой же постановке вопроса, как у тебя (судя по коду), этот вариант не подойдет.
0
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:49  [ТС]
Примерно вот так, если не ошибаюсь:
C++
1
    Pair(T some_first, U some_second): first(some_first), second(some_second) { cout << *this << endl; }
при
C++
1
2
3
4
 template<class T, class U> ostream& operator<< (ostream& os, Pair<T,U> pair) {
    os << pair.get_first() << ' ' << pair.get_second();
    return os;
}
А что если я хочу фиксировать созданный объект в произвольном контейнере, например?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:53
Цитата Сообщение от Sentipar Посмотреть сообщение
А что если я хочу фиксировать созданный объект в произвольном контейнере, например?
Я думаю, что для простоты (на данном этапе постижения информации) тебе стоит считать, что право распоряжаться объектом (класть его в контейнеры, удалять, копировать и т.д.) должен иметь тот уровень исполнения, который его (объект) создал. Тогда все намного упростится.
1
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:55  [ТС]
DrOffset, Благодарю, и до новых встреч.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2014, 00:55
Помогаю со студенческими работами здесь

Класс для работы с векторами.
Помогите добавить возможность ввода своих данных(размерности, самих чисел) #include &quot;iostream&quot; #include &lt;math.h&gt; ...

Как создать единый сайт из разрозненных скриптов php на основе css
Я осваиваю PHP и CSS. Я сделал несложную фотогалерею на основе фреймов. Получилась куча скриптов, каждый из которых загружается в ...

Класс для работы с битовыми векторами
Створити клас Bitv для роботи з бітовими векторами довільної довжини. Бітовий вектор – послідовність значень, які можуть мати значення 0...

Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо
Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо. Дополнительно есть марка,...

Создать класс Man (человек), с полями: имя, возраст, пол и вес. Создать производный класс Student ...
Создать класс Man (человек), с полями: имя, возраст, пол и вес. Определить методы задания имени, возраста и веса. Создать производный класс...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru