В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Абстрактный шаблонный класс26.09.2010, 03:22. Показов 10831. Ответов 45
Метки нет (Все метки)
Вообщем какое дело. У меня есть класс матрица, который сделан с использованием шаблонов и STL. В нем перегружены операторы ввода/вывода в поток(то, что их не врубить в динамический полиморфизм я уже понял).
Первый класс:
Пробую так.
А так же есть вариант оставить оба варианта. Но будут вызываться операторы ввода/вывода из класса Matr. И следующий вопрос. Добавляю в первый класс две чисто виртуальные функции. Класс принимает вид:
Ошибка происходит в этой функции.
1
|
26.09.2010, 03:22 | |
Ответы с готовыми решениями:
45
Указатель на абстрактный шаблонный класс Класс: Разработать абстрактный класс класс Point для задания координаты... Класс Matrix: реализовать шаблонный класс для двумерных массивов Шаблонный класс и класс одномерный массив |
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
26.09.2010, 03:50 | 2 | |||||
Добавлено через 3 минуты никак или объявить виртуальным
2
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
26.09.2010, 03:56 | 4 | |||||
auto_ptr - бяка
2
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2010, 03:56 [ТС] | 5 |
alex_x_x, Да) Так и было написано. А тут забыл(
auto_ptr конечно бяка, но сказали, если использовать указатели использовать именно его. У нас ребята и от этого офигевают чуть более чем полностью. Препод буст нам решил пока не давать. ЗЫ: объявить виртуальным в каком смысле? Сам класс? Или виртуальное наследование? niXman, Задача, чтобы разделить класс. На реализацию и собственно консольный ввод/вывод, дабы сам класс Matr мог быть актуален на любой платформе. То есть не только в консольных, но и в других. Должно быть сделано с использованием STL и шаблонов.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2010, 04:02 [ТС] | 7 |
niXman, Скорее хочу сделать так, чтобы реализация этих методов не зависила от остального класса, если это пригодится. Каждый ввод в свой класс. Пока у меня стоит задача только консольного ввода-вывода. Препод нам на таком примере объясняет концепции ООП впринципе.
1
|
26.09.2010, 04:13 | 8 |
что-то ты напутал...
класс - шаблонный. перегруженные операторы - шаблонные. в добавок, еще и дружественные функции этого класса ну намешал... объясни, что требуется? Добавлено через 1 минуту наверное я не уловил гениальность твоей идеи
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2010, 04:15 [ТС] | 9 |
niXman, Не моей. Препод попросил так сделать.
Вообщем... У нас есть класс. Допустим тот же Matr. Шаблонный. В нем есть ввод/вывод в поток (консольный). Попросили сделать так, чтобы от Matr был производный шаблонный класс, в котором и реализуются ввод/вывод на консоль. Это реально? Если нет, то по какой причине, если да, то каким образом. Или не пытаться реализовать эту идею вцелом?
0
|
84 / 57 / 8
Регистрация: 07.08.2010
Сообщений: 185
|
|||||||||||
26.09.2010, 04:17 | 10 | ||||||||||
Ты задал два разных вопроса.
Первый ты уже похоже разрешил. Только я бы сделал вот так:
Второй вопрос достаточно интересен. Начнём с того, что возвратить по-значению абстрактный класс ты не сможешь. А операторы принципиально возвращают по-значению, поэтому нужно что-то менять. Решается это через идиому handle/body. Идея такая:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2010, 04:29 [ТС] | 11 |
alexzak, Красиво.
Первый вариант очень понравился. Второй - тоже гуд, однако несколько не улыбает с этим настолько морочиться, т.к. это учебная программа и мои одногруппники лучше чем у меня была сделана в этот раз не сделают. Им итак надо за неделю понять стл, шаблоны, виртуальные функции, наследование и само ООП вообщем. Другое дело, что это действительно интересно. Надо будет запомнить об этой идиоме. Я так понимаю ее приблизительный смысл - использование включения(или композиции, не совсем могу понять что из этого тут используется). У нас есть абстрактный класс, есть производный от абстрактного (который и есть главная задача реализовать), а так же есть класс в который входят указатели на объекты абстрактного класса и действие производится в основном через этот класс. Верно?
0
|
84 / 57 / 8
Регистрация: 07.08.2010
Сообщений: 185
|
|
26.09.2010, 04:46 | 12 |
handle - это тот класс, с которым мы оперируем по-значению, как с обычными неполиморфным классом. Только так мы можем реализовать невиртуальные операторы умножения и т.д. А body - это полиморфный объект, с которым мы оперируем через указатель на базовый класс.
Это не композиция. Это скорее разделение интерфейса и реализации. Интерфейс здесь - это невиртуальный operator*. А реализация - это метод mult_op. (В данном случае он невиртуальный из-за простоты задачи. А мог бы быть, будь задача посложнее.)
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2010, 04:57 [ТС] | 13 |
alexzak, Относительно понял. А возможно это сделать не прибегая к паттернам? Виртуальными функциями или же какими-нибудь танцами с бубном? Просто интересно
0
|
84 / 57 / 8
Регистрация: 07.08.2010
Сообщений: 185
|
||||||
26.09.2010, 05:09 | 14 | |||||
Проблема фундаментального характера. Если Matr абстрактный, то по значению его возвратить нельзя. Но если сделать его конкретным, то можно реализовать operator* как в классе Matr, так и в классе ConsoleMatr:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2010, 05:17 [ТС] | 15 |
alexzak, Если Matr будет конкретный - я не особо вижу смысла переопределять операторы в производном классе. Перегруженные операторы ведь наследуются, а в данном случае оператор умножения матриц не изменится в любом случае. Ибо это стабильная формула. В чем смысл перегрузки оператора * для ConsoleMatr?
0
|
84 / 57 / 8
Регистрация: 07.08.2010
Сообщений: 185
|
||||||
26.09.2010, 05:21 | 16 | |||||
Как тогда ты сделаешь такое:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
26.09.2010, 05:25 [ТС] | 17 | |||||
alexzak, А для чего? Если для этого - вижу смысл, но, я собираюсь пользоваться дин. полиморфизмом, через auto_ptr<Matr<int> >;
Следовательно объекты будут типа Matr, но выделена под них память будет под тип ConsoleMatr.
0
|
84 / 57 / 8
Регистрация: 07.08.2010
Сообщений: 185
|
||||||
26.09.2010, 05:29 | 18 | |||||
Как ты такие объекты собираешься умножать?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||
26.09.2010, 05:40 [ТС] | 19 | |||||||||||||||
alexzak,
Добавлено через 8 минут Как пример:
0
|
84 / 57 / 8
Регистрация: 07.08.2010
Сообщений: 185
|
|
26.09.2010, 05:44 | 20 |
В выражении '*Ob3 = *Ob1 * *Ob2' не только operator* должен возвратить результать по-значению, что возможно только если 1) оба класса Matr и ConsoleMatr - конкретные, 2) для каждого из них определён operator* возвращающий значение правильного типа. Но и operator= должен быть виртуальным (тип выражения *Ob3 - Matr&, а не ConsoleMatr&), что само по себе уже странно. А невиртуальный operator= сделает slicing, т.е. он присвоит в объекте Ob3 только часть из базового Matr, но не весь ConsoleMatr. В общем вся объектная модель С++ ломается.
1
|
26.09.2010, 05:44 | |
26.09.2010, 05:44 | |
Помогаю со студенческими работами здесь
20
Разработать абстрактный класс класс Point для задания координаты Класс: Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Абстрактный класс, наследование, класс хранится в другом классе Переделать класс в шаблонный класс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |