Форум программистов, компьютерный форум CyberForum.ru

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

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

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

30.03.2014, 23:59. Просмотров 332. Ответов 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; // целевой вектор;
};
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 23:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать единый класс с шаблонными векторами (C++):

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

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

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

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

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями - C++
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Класс вектор на основе класса Complex. Найти угол между векторами - C++
класс вектор на основе класса комплекс найти кут между векторами...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7103 / 4244 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
31.03.2014, 00:02 #2
Цитата Сообщение от Sentipar Посмотреть сообщение
C++
1
vector<Pair<T,U>> vec; // целевой вектор;
Пока все это странно выглядит. Вектор именно внутри Pair?
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:04  [ТС] #3
Да я знаю. Я просто хочу, чтоб при инициализации нового объекта Pair, этот объект записывался в соответствующий вектор.
DrOffset
7103 / 4244 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
31.03.2014, 00:12 #4
Sentipar, так если вектор внутри Pair, то даже если сделать запись туда, то в нем всегда будет один элемент. Нужно именно такое поведение?
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:15  [ТС] #5
Ага, вот теперь до меня дошло. Нет, не совсем, задумка была в том, чтоб записывать в вектор разные пары значений. Но вот теперь я понял насколько это глупо. Лучше определить вектор вне класса и записывать туда значения, не так ли?
DrOffset
7103 / 4244 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
31.03.2014, 00:16 #6
Цитата Сообщение от 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;
};
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:18  [ТС] #7
Я почему то так и думал, но побоялся использовать (*this) ибо не знал до конца, к чему приведёт эта конструкция. Спасибо.

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

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

Цитата Сообщение от Sentipar Посмотреть сообщение
Т.е. класс Pair будет автоматически вписывать однородные объекты при заданном векторе?
Нет никаких причин возлагать эту ответственность на класс Pair. Это походит на то, что вот родился ребенок и сам тут же выбрал себе имя, место работы и все остальное. Но в реальной жизни всем очевидно, что это вне зоны его ответственности. Почему здесь должно быть иначе?
Однако есть задачи, где может потребоваться регистрировать созданные объекты в каком-то глобальном контейнере. И можно эту регистрацию проводить из самого объекта. Но это требует наложения определенных условий на способ создания таких объектов. При такой же постановке вопроса, как у тебя (судя по коду), этот вариант не подойдет.
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:49  [ТС] #13
Примерно вот так, если не ошибаюсь:
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;
}
А что если я хочу фиксировать созданный объект в произвольном контейнере, например?
DrOffset
7103 / 4244 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
31.03.2014, 00:53 #14
Цитата Сообщение от Sentipar Посмотреть сообщение
А что если я хочу фиксировать созданный объект в произвольном контейнере, например?
Я думаю, что для простоты (на данном этапе постижения информации) тебе стоит считать, что право распоряжаться объектом (класть его в контейнеры, удалять, копировать и т.д.) должен иметь тот уровень исполнения, который его (объект) создал. Тогда все намного упростится.
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:55  [ТС] #15
DrOffset, Благодарю, и до новых встреч.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2014, 00:55
Привет! Вот еще темы с ответами:

Создать класс - данные - абстрактный базовый класс. Создать производные классы - C++
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

Не получается сделать 3 класса шаблонными. - C++
Есть три класса + функция main, в которой используются эти классы. Все работает. Сделал эти три класса шаблонными. В main в объявлении...

Не работает программа с шаблонными функциями - C++
Дана целочисленная прямоугольная матрица . Напишите программу, определяющую величины: 1) количество элементов матрицы, меньших величины...

typename. Проблемы с вложенными шаблонными типами - C++
Здравствуйте. Реализовываю шаблонный список. /* * List.h */ #pragma once #include &lt;iostream&gt; using namespace std;


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.03.2014, 00:55
Ответ Создать тему
Опции темы

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