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

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

Восстановить пароль Регистрация
 
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
30.03.2014, 23:59     Создать единый класс с шаблонными векторами #1
Здравствуйте, уважаемые. Возник 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++
Не получается сделать 3 класса шаблонными. C++
Создать класс, для работы с динамическими векторами C++
C++ Класс для работы с битовыми векторами
C++ Создать класс Matrix и класс Size
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
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
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
31.03.2014, 00:12     Создать единый класс с шаблонными векторами #4
Sentipar, так если вектор внутри Pair, то даже если сделать запись туда, то в нем всегда будет один элемент. Нужно именно такое поведение?
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:15  [ТС]     Создать единый класс с шаблонными векторами #5
Ага, вот теперь до меня дошло. Нет, не совсем, задумка была в том, чтоб записывать в вектор разные пары значений. Но вот теперь я понял насколько это глупо. Лучше определить вектор вне класса и записывать туда значения, не так ли?
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
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
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
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
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
31.03.2014, 00:31     Создать единый класс с шаблонными векторами #10
Sentipar, не совсем ясно зачем это может понадобиться делать? Опиши лучше свою задачу, чтобы мне не гадать и потенциально правильный совет дать.
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:34  [ТС]     Создать единый класс с шаблонными векторами #11
DrOffset, Задача примерно состоит в том что нужно сделать таблицу пар любых допустимых типов ("Имя - значение") и затем записать их в вектор для вывода на экран.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
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
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
31.03.2014, 00:53     Создать единый класс с шаблонными векторами #14
Цитата Сообщение от Sentipar Посмотреть сообщение
А что если я хочу фиксировать созданный объект в произвольном контейнере, например?
Я думаю, что для простоты (на данном этапе постижения информации) тебе стоит считать, что право распоряжаться объектом (класть его в контейнеры, удалять, копировать и т.д.) должен иметь тот уровень исполнения, который его (объект) создал. Тогда все намного упростится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2014, 00:55     Создать единый класс с шаблонными векторами
Еще ссылки по теме:

typename. Проблемы с вложенными шаблонными типами C++
Класс вектор на основе класса Complex. Найти угол между векторами C++
C++ Создать класс и класс-потомок с полями

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

Или воспользуйтесь поиском по форуму:
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
31.03.2014, 00:55  [ТС]     Создать единый класс с шаблонными векторами #15
DrOffset, Благодарю, и до новых встреч.
Yandex
Объявления
31.03.2014, 00:55     Создать единый класс с шаблонными векторами
Ответ Создать тему
Опции темы

Текущее время: 15:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru