979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
1 | |
Stack со сменой представления09.09.2013, 13:44. Показов 2427. Ответов 51
Метки нет (Все метки)
Здорова господа!!!
Есть задачка: "Напишите класс Stack, для которого можно сменить представление на стадии выполнения программы. Подсказка: "Любую проблему можно решить введя еще один уровень косвенности" " Тут не понятно что нам нужно сделать. Рассмотрим просто теоретически, допустим есть у нас класс Stack и нам что нужно от него по создавать производные классы допустим А и допустим B. Создаем указатель на Stack *p И создаем указатель на A *pa и указателю p присваиваем указатель pa и у нас получится что мы изменили представление класса Stack, что бы еще поменять то мы создаем указатель B* pb со своим набором дополнительных функций снова присваиваем p = pb уже новое представление, это имелось введу. Хотя на стадии выполнения имелось в веду dynamic_cast<>() понятно что перед выполнением мы приведем Stack к нужному типу. Что понимается под сменой представления на стадии выполнения? Я понимаю полиморфизм имелся введу или что? А эта строчка что означает: "Любую проблему можно решить введя еще один уровень косвенности" Что такое уровень косвенности, косвенности это как бы через промежуток обращение не на прямую, видимо нужно производные классы создавать. Объясните новичку!!!!
0
|
09.09.2013, 13:44 | |
Ответы с готовыми решениями:
51
[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>' Есть ли связь между STL-stack и stack - высокопроизводительная память? error C2440: 'return' : cannot convert from 'stack<X>' to 'stack<X> *' Как получить нужные данные из представления , а именно строки представления |
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 13:54 | 2 |
объяснение простое - я тоже ничего не понял, составитель задания был большой оригинал или хочет вырастить из вас моцарта
Добавлено через 44 секунды ...с тем же успехом он мог бы написать короче: любую проблему можно решить)
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:02 [ТС] | 3 |
Так может просто у вас знаний не хватает, что бы понять что имелось в веду в задании? Задание на проектирование классов ООП, что бы понять нужно хорошо знать шаблоны проектирования!
Добавлено через 3 минуты Давайте господа ваши варианты по решению или я так сделаю как описал, просто наследование от Stack сделаю и поменяю "представление" класса Stack, а потом на стадии выполнения буду приводить к нужному типу. Если так не правильно то как правильно делать????
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:06 | 4 |
мой вариант - спросить у преподавателя чего ему нужно. я конечно понимаю - программирование и анализ предложения русского языка вещи чем-то перекликающиеся, но вроде как вместо решения задания приходится гадать шарады... второй вариант - может "волшебные" слова есть в конспектах и их хочет услышать препод
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:08 [ТС] | 5 |
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:11 | 6 |
вот, например, познакомьтесь с выдержкой из книги Бьерн Страуструп. Язык программирования С++
"Унарная операция * называется косвенностью (или операцией разыменования), она выбирает значение объекта, на который настроен указатель." - я в шоке. кто бы мог подумать о таком применении великого русского языка. оказывается волей перевода (а может это как раз был очень умный переводчик и беда в том что все остальные переводчики были глупы) операция разыменования была названа косвенностью. хотя в этом тексте она как то слабо нахлобучиваеся на вашу песню
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:12 [ТС] | 7 |
vxg, Так почему гадать в задании ж подсказка есть: "Любую проблему можно решить введя еще один уровень косвенности". Читай внимательно!!!
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:13 | 8 |
..оо.. я попал пальцем в небо. значит надо исследовать данный труд на заскоки в терминах
Добавлено через 43 секунды ну и о какой косвенности в данном случае тогда речь? еще один уровень это еще одна звездочка? как то не так
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:14 [ТС] | 9 |
Да что тут не ясного просто косвенно операция * вызывает operator*() или глобально operator*(тип, тип). Получается косвенно умножает или разыменовывает через вызовы функций.
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:16 | 10 |
неясно зачем разыменование называть косвенность (вообще ни рода ни падежа - что за зверь неясно) и зачем подразумевать у этой косвенности уровень (что за уровень? да это же просто еще одно разыменование ой ла ла). переводчика - к стене. книгу... (защищается от молнии) - в топку - как вариант: читать в оригинале без загонов перевода
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:17 [ТС] | 11 |
Не придираемся к словам, смысл же понятно, что такое оператор *. Пофигу как что переведено смысл от этого не исказится.
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:21 | 12 |
кстати, в том переводе что я нашел в сети задача о которой речь звучит вообще интересно
13.(*3) Составьте такое описание класса stack, для которого можно в динамике менять реализацию. Подсказка: "Всякую задачу можно решить, введя еще одну косвенность". сравните с Напишите класс Stack, для которого можно сменить представление (в том переводе это реализация) на стадии выполнения программы (в том переводе это в динамике). Подсказка: "Любую проблему можно решить введя еще один уровень косвенности таким образом видим что ваш перевод вообще нельзя сделать ибо во время выполнения вы представление (тоже хз что это означает - предположим что имеется ввиду реализация) не измените. короче хх
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:22 [ТС] | 13 |
ну смотри если мы что касается задачи, если мы обращаемся через посредник к классу, то мы как бы косвенно к им манипулируем, если на прямую то это уже не косвенно. Уровень косвенности создать еще один, я думаю нужно просто наследования сделать от Stack и мы будет "косвенно" обращатся к стек, + добавим какие нить функции.
Плюс на стадии выполнения можно сам Stack поменять либо чисто оставить такой какой есть, либо изменить представление на представление производных классов используя dynamic_cast<>(). Я сам в этом не сильно шарю, но смотрю ты тоже слабувато .
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:22 | 14 |
давайте попробуем перевести по-хорошему и решим. я не против
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:23 [ТС] | 15 |
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:23 | 16 |
у меня длиннее, ты же видишь цифры)
сейчас найдем оригинальный перевод и все заработает. нелишним было бы выбросить сюда и сам класс собственно
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
09.09.2013, 14:35 [ТС] | 17 | |||||
Можно так как я описал решать: сделать наследника например А и через проверять dynamic_cast<>() какой у нас класс передается
Кто думаешь что по другому ее решать? Добавлено через 5 минут vxg, Мы можем сказать на неясность условия и сделать так как понимает, если кто спросит, скажем что в условии так было, я думаю гадать не нужно просто примерно сделать да и все.
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:37 | 18 |
возможно в силу своего ограниченного мировосприятия я понимаю задание
Напишите класс Stack, для которого можно сменить представление на стадии выполнения программы. Подсказка: "Любую проблему можно решить введя еще один уровень косвенности" следующим образом: возьмите класс Stack и перепишите его таким образом что бы его методы стали виртуальными. тупо? да. однако 256 раз прогнав через кости это задание не приходит ничего красивее. они хотят сменить представление. под представлением я так понимаю они имеют ввиду сущность объекта. причем именно объекта Stack а не тех объектов которые он хранит. они хотят модифицировать его. хотят что бы наш абстрактный Stack вел себя по разному в зависимости от того как его расширили внутри программы.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
09.09.2013, 14:50 [ТС] | 19 |
Так можно его не переписывать просто сделать наследование, у нас же может быть какой нить комерческий класс. Ну да виртуальные полюбом нужно делать методы, а то dynamic_cast<>() работать не будет. Ну да наверно так и делать.
А для реального класса Stack который мы не можем переписать не абстрактного, мы можем сделать наследование к классу у которого будет абстрактный член (полиморфный тип) и от него еще поделать наследники, двойной как бы уровень косвенности, да наверно так. Там пишется что к любой иерархии классов можно лекгко встроить любой другой класс или иерархию, там просто двойное наследование применяют и наследник имеет свойства двух иерархий. О еще вариант если Stack не полиморфный класс и мы его изменить не можем, то мы создаем класс свой Abstrakt_Stack полиморфный, от него делаем производный класс A : public Abstrakt_Stack, public Stack и B : public Abstrakt_Stack, public Stack эти классы будут размым представлением класса Stack и уже через указатель не Stack, а Abstrakt_Stack мы можем в реальном времени менять представление Stack. Этот прием видимо применяется для реальных библиотек которые нельзя изменить, но нужно расширить. Добавлено через 2 минуты vxg, Можно создать уровень косвенности для любого класса в иерархии классов и решить любую проблему .
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
|
|
09.09.2013, 14:54 | 20 |
нам не нужно делать dynamic_cast. у нас будет абстрактный стек. и у него виртуальный метод, например, вставить. мы это метод расширим в классе, например, папка с файлами. расширим таким образом что бы вставка кроме стандартного поведения (обновления списка элементов стека) приводила к реальной вставке файла в папку. если мы создадим объект класса папка с файлами и передадим указатель на него в функцию которая принимает указатель на стек, то эта функция оперируя со стеком будет фактически обращаться к папке с файлами.
зачем нам еще одно поле в классе? пусть даже абстрактного типа? очень все запутано, что то тут у вас не так)
0
|
09.09.2013, 14:54 | |
09.09.2013, 14:54 | |
Помогаю со студенческими работами здесь
20
Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun" Как проинициализировать std::stack<const int> obj ( std::stack<int>{} ); Переустановка со сменой разрядности Работа со сменой картинки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |