![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Есть такая проблема:
Есть абстракстный интерфейс стека (Stack), в нем есть операции Top, Delete, Insert, ForEach и (!) operator= ну, и еще нам нужен оператор копирования Стек может быть реализован как угодно в классе наследнике. Возникает проблема реализовать конструктор копирования... В конструкторе копирования я использую виртуальную функцию clone, которую потом перегружаю в каждой реализации, но, в clone-то передается ссылка на Stack (наш интерфейс), чез который не особо-то и можно скопировать... Вот сейчас думаю, как его реализовать, были такие идеи: использовать ForEach и Insert... отлично, но мы не можем в ForEach передать функцию-член класса :( и два варианта: 1. реализовать функцию at(int) для доступа к i-тому элементу стека, но 1. Стек может быть реализован через список, а тогда это плохо 2. Никакого at по условию нет в абстрактном классе 2. написать итератор... но это будет еще хуже впихиваться в условия задачи (пишу не себе ;))... и походу этого делать не буду Вот. Что собсно можно сделать еще? -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
использовать статический полиморфизм, а не динамический было-бы логичней в данном случае |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Нееее, хотя бы потому, что это не подойдет под условие задачи еще больше, чем любой другой изврат... :(
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
это не изврат, если ты хочешь реализзовать конструктор копирования, значит тебе нужна семантика значений, тоесть абстрактный базовый класс здесь совершенно не у дел.
конструктор копирования нельзя сделать виртуальным, соответственно в абстрактном базовом классе ему нет места, так как у него по определению нет состояния. |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Почему же, если бы в базом класе были функции для доступа не только к первому элементу, но и ко всем, то все бы реализовывалось, т.е. скорее всего что-то вводить придется, вопрос - что...
-------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
можно использовать паттерн Посетитель
типа такого выйдет есть StackParent и дети: Stack1, Stack2
Добавлено @ 21:46 то же и с copy constructor хотя не совсем так - в моем случае интерфейс StackParent зависит от наследников дальше думать лень, но, вроде, Посетитель и эту проблему решает Это сообщение отредактировал(а) Alek86 - 14.12.2008, 21:48 |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Тогда мы должны знать всех потомков... -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
точно, надо выделить интерфейс Посетителя, который будет за тех потомков отвечать
подробнее - в инете, по запросу "паттерн Посетитель" |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
есть интерфейс стека, для копии вызываете виртуальную Clone, за реализацию которой ответственнен конкретный объект, у которого все нужные методы присутствуют. Так ? а в чем проблема то ? Особенно не понял
а для чего собственно передается ?? this`a более чем достаточно. Это сообщение отредактировал(а) mes - 14.12.2008, 22:09 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
mes, если есть 2 потомка - stack1 и stack2, то между ними - 4 варианта копирования
если 3 потомка - 6 вариантов и так далее а вирт функция - только одна |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
вот поэтому в таких случаях не используют конструктор копирования. если твой стек поддерживает итераторы, то можно вместо метода clone, добавить методы begin, end и assign
Добавлено через 1 минуту и 50 секунд
или
|
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
то есть надо чтоб
тогда Clone, то тут не при чем ! Это сообщение отредактировал(а) mes - 14.12.2008, 22:17 |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
с чего это стеку вдруг поддерживать итераторы?
можно, конечно, с пом pop, top, push скопировать, но это ж будет довольно неэкономично Добавлено через 23 секунды mes, да, к примеру |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если эту задача решать эффективно через полиморфизм базового класса, то без визитера не обойтись. В другом случае каждый наследник, должен уметь себя создавать имея ссылку на базовый интерфейс. Добавлено @ 22:25
а функтор можем передавать ? Это сообщение отредактировал(а) mes - 14.12.2008, 22:32 |
|||
|
||||
| BSOD |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
На самом деле это всего-лишь в 3 раза "неэкономичнее", чем просто копирование ;)... и этот вариант я тож рассматривал (на крайняк Да, я понимаю, что это совсем жуткий изврат, но всеравно, ведь это будет работать (1), мы не будем менять ничего в абстрактном классе (2) и это даже не будет особо тормозить (!) сорри, что я тут сам с собой нафлудил немного, эмоции Добавлено через 1 минуту и 21 секунду
Эммм, а кстати да, как вариант... но всеравно, придется немного, да подправить базовый класс.. -------------------- как корабль назовешь - то на нем и напишешь |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |