![]() |
|
Модераторы: 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 секунду
Эммм, а кстати да, как вариант... но всеравно, придется немного, да подправить базовый класс.. -------------------- как корабль назовешь - то на нем и напишешь |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
|
|||
|
||||
| BSOD |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
а в потомке уже
а так нельзя, получится, что нет реализации чисто виртуальной функции в классе потомке ;) Это как бы было первое, что все пробовали, после чего эта проблема и обнаружилась ;) Добавлено через 34 секунды
Указатель на функцию -------------------- как корабль назовешь - то на нем и напишешь |
||||||
|
|||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
можно перегруженная переопределенная функция может возвращать указатель или ссылку на потомков/предков возвращаемого оригинала Это сообщение отредактировал(а) J0ker - 15.12.2008, 00:31 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
BSOD, мне кажется, имел ввиду что при такой конструкции не получится сделать следующее :
Добавлено @ 23:35 думаю подойдет такой вот насбросок:
Это сообщение отредактировал(а) mes - 15.12.2008, 00:10 |
||||||
|
|||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
такое и не должно получаться, если D1 и D2 не являются ковариантами для таких присвоений надо делать либо оператор преобразования типов либо специальный оператор= Добавлено через 2 минуты и 19 секунд функцию копирования лучше делать внешней и темплетной - как и сделано в STL непонятно, зачем изобретать велосипед |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну да я сильно упростил, так будет точнее
согласен...но в классе я оставил ee специально для демонстрации, мне показалось так для тс будет яснее подходит ли ему такой способ или нет, а сама функция фактически и не нужна (только как оболочка), всю реализацию несет на себе функтор . как понял для сессии. Это сообщение отредактировал(а) mes - 15.12.2008, 00:10 |
||||||
|
|||||||
| BSOD |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Я не про то, прост мы же получается не перегрузим функцию из родителя а введем новую. А т.к. в родителе наша функция чисто виртуальная, то компилер будет ругаться, что мы не ее не перегрузили в потомке.
Ну вот это я думаю прокатит, но я вроде бы как-то ужн реализовал, сейчас буду смотреть, что получилось Добавлено через 6 минут и 13 секунд
ну на самом деле наверное нужно было
;)
Что-то типа того -------------------- как корабль назовешь - то на нем и напишешь |
||||||||||
|
|||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
А Вы попробуйте и будете сильно удивлены Только такая технология позволяет только клонирование, но не копирование объекта от потомка к потомку другого типа. |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
...
Это сообщение отредактировал(а) mes - 15.12.2008, 00:30 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
вы меня запутали млин
не перегрузка конечно, а переопределение |
|||
|
||||
| BSOD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 1.11.2004 Где: Гомель Репутация: нет Всего: 3 |
Сорри, немного не досмотрел, так действительно должно работать Сделал почти так, только Клон ничего не возвращает, а в него передается ссылка на другой стек, куда он себя и копирует Всем спасибо, вопрос вроде как исчерпан -------------------- как корабль назовешь - то на нем и напишешь |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |