Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Stack со сменой представления - C++

09.09.2013, 13:44. Просмотров 1366. Ответов 51
Метки нет (Все метки)

Здорова господа!!!

Есть задачка: "Напишите класс Stack, для которого можно сменить представление на стадии выполнения программы. Подсказка: "Любую проблему можно решить введя еще один уровень косвенности" "

http://www.cyberforum.ru/cpp-beginners/thread815362.html
Тут не понятно что нам нужно сделать. Рассмотрим просто теоретически, допустим есть у нас класс Stack и нам что нужно от него по создавать производные классы допустим А и допустим B. Создаем указатель на Stack *p И создаем указатель на A *pa и указателю p присваиваем указатель pa и у нас получится что мы изменили представление класса Stack, что бы еще поменять то мы создаем указатель B* pb со своим набором дополнительных функций снова присваиваем p = pb уже новое представление, это имелось введу. Хотя на стадии выполнения имелось в веду
dynamic_cast<>() понятно что перед выполнением мы приведем Stack к нужному типу.

Что понимается под сменой представления на стадии выполнения? Я понимаю полиморфизм имелся введу или что?

А эта строчка что означает: "Любую проблему можно решить введя еще один уровень косвенности" Что такое уровень косвенности, косвенности это как бы через промежуток обращение не на прямую, видимо нужно производные классы создавать.

Объясните новичку!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 13:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Stack со сменой представления (C++):

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun"
Не могу понять почему значение ChoiceOfPlayer меняется и почему NumberOfRow и...

Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );
добрый день. вопрос в коде: http://rextester.com/VCVVML6656 #include...

Циклические программы с регулярной сменой аргумента.
Код С++ ...

Циклические программы с регулярной сменой аргумента, содержащих разветвления
Лабораторная работа 4. Циклические программы с регулярной сменой аргумента,...

Циклические программы с регулярной сменой аргумента, содержащие ветвления
Помогите написать программу задачи. Плиз. Вывести на печать значения,...

51
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 13:54 #2
объяснение простое - я тоже ничего не понял, составитель задания был большой оригинал или хочет вырастить из вас моцарта

Добавлено через 44 секунды
...с тем же успехом он мог бы написать короче: любую проблему можно решить)
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:02  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
объяснение простое - я тоже ничего не понял, составитель задания был большой оригинал или хочет вырастить из вас моцарта
Так может просто у вас знаний не хватает, что бы понять что имелось в веду в задании? Задание на проектирование классов ООП, что бы понять нужно хорошо знать шаблоны проектирования!

Добавлено через 3 минуты
Давайте господа ваши варианты по решению или я так сделаю как описал, просто наследование от Stack сделаю и поменяю "представление" класса Stack, а потом на стадии выполнения буду приводить к нужному типу. Если так не правильно то как правильно делать????
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:06 #4
мой вариант - спросить у преподавателя чего ему нужно. я конечно понимаю - программирование и анализ предложения русского языка вещи чем-то перекликающиеся, но вроде как вместо решения задания приходится гадать шарады... второй вариант - может "волшебные" слова есть в конспектах и их хочет услышать препод
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:08  [ТС] #5
Цитата Сообщение от vxg Посмотреть сообщение
мой вариант - спросить у преподавателя чего ему нужно.
Нет это задание из книги Страуструпа.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:11 #6
вот, например, познакомьтесь с выдержкой из книги Бьерн Страуструп. Язык программирования С++
"Унарная операция * называется косвенностью (или операцией
разыменования), она выбирает значение объекта, на который настроен
указатель." - я в шоке. кто бы мог подумать о таком применении великого русского языка. оказывается волей перевода (а может это как раз был очень умный переводчик и беда в том что все остальные переводчики были глупы) операция разыменования была названа косвенностью. хотя в этом тексте она как то слабо нахлобучиваеся на вашу песню
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:12  [ТС] #7
vxg, Так почему гадать в задании ж подсказка есть: "Любую проблему можно решить введя еще один уровень косвенности". Читай внимательно!!!
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:13 #8
..оо.. я попал пальцем в небо. значит надо исследовать данный труд на заскоки в терминах

Добавлено через 43 секунды
ну и о какой косвенности в данном случае тогда речь? еще один уровень это еще одна звездочка? как то не так
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:14  [ТС] #9
Цитата Сообщение от vxg Посмотреть сообщение
вот, например, познакомьтесь с выдержкой из книги Бьерн Страуструп. Язык программирования С++
"Унарная операция * называется косвенностью (или операцией
разыменования), она выбирает значение объекта, на который настроен
указатель." - я в шоке. кто бы мог подумать о таком применении великого русского языка. оказывается волей перевода (а может это как раз был очень умный переводчик и беда в том что все остальные переводчики были глупы) операция разыменования была названа косвенностью. хотя в этом тексте она как то слабо нахлобучиваеся на вашу песню
Да что тут не ясного просто косвенно операция * вызывает operator*() или глобально operator*(тип, тип). Получается косвенно умножает или разыменовывает через вызовы функций.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:16 #10
Цитата Сообщение от ninja2 Посмотреть сообщение
что тут не ясного
неясно зачем разыменование называть косвенность (вообще ни рода ни падежа - что за зверь неясно) и зачем подразумевать у этой косвенности уровень (что за уровень? да это же просто еще одно разыменование ой ла ла). переводчика - к стене. книгу... (защищается от молнии) - в топку - как вариант: читать в оригинале без загонов перевода
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:17  [ТС] #11
Не придираемся к словам, смысл же понятно, что такое оператор *. Пофигу как что переведено смысл от этого не исказится.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:21 #12
кстати, в том переводе что я нашел в сети задача о которой речь звучит вообще интересно
13.(*3) Составьте такое описание класса stack, для которого можно
в динамике менять реализацию. Подсказка: "Всякую задачу можно
решить, введя еще одну косвенность".
сравните с
Напишите класс Stack, для которого можно сменить представление (в том переводе это реализация) на стадии выполнения программы (в том переводе это в динамике). Подсказка: "Любую проблему можно решить введя еще один уровень косвенности

таким образом видим что ваш перевод вообще нельзя сделать ибо во время выполнения вы представление (тоже хз что это означает - предположим что имеется ввиду реализация) не измените. короче хх
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:22  [ТС] #13
Цитата Сообщение от vxg Посмотреть сообщение
и зачем подразумевать у этой косвенности уровень
ну смотри если мы что касается задачи, если мы обращаемся через посредник к классу, то мы как бы косвенно к им манипулируем, если на прямую то это уже не косвенно. Уровень косвенности создать еще один, я думаю нужно просто наследования сделать от Stack и мы будет "косвенно" обращатся к стек, + добавим какие нить функции.

Плюс на стадии выполнения можно сам Stack поменять либо чисто оставить такой какой есть, либо изменить представление на представление производных классов используя dynamic_cast<>().

Я сам в этом не сильно шарю, но смотрю ты тоже слабувато .
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:22 #14
давайте попробуем перевести по-хорошему и решим. я не против
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:23  [ТС] #15
Цитата Сообщение от vxg Посмотреть сообщение
таким образом видим что ваш перевод вообще нельзя сделать ибо во время выполнения вы представление (тоже хз что это означает - предположим что имеется ввиду реализация) не измените. короче хх
ну походу ты не знаешь что такое RTTI.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:23 #16
Цитата Сообщение от ninja2 Посмотреть сообщение
но смотрю ты тоже слабувато
у меня длиннее, ты же видишь цифры)
сейчас найдем оригинальный перевод и все заработает. нелишним было бы выбросить сюда и сам класс собственно
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:35  [ТС] #17
Цитата Сообщение от vxg Посмотреть сообщение
давайте попробуем перевести по-хорошему и решим. я не против
Можно так как я описал решать: сделать наследника например А и через проверять dynamic_cast<>() какой у нас класс передается
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
f(Stack* s)
{
 if(A* p =dynamic_cast<A*>(s)) 
    //представление А
else if(B* p=dynamic_cast<B*>(s))
   //представление B
else
   //я думаю если реально предадим указатель на базовый класс
  //то он не приведется в A или B (призабыл) 
  //тут сам реальный базовый Stack
}
Отак от обрабатывать на стадии выполнения???
Кто думаешь что по другому ее решать?

Добавлено через 5 минут
vxg, Мы можем сказать на неясность условия и сделать так как понимает, если кто спросит, скажем что в условии так было, я думаю гадать не нужно просто примерно сделать да и все.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:37 #18
Цитата Сообщение от ninja2 Посмотреть сообщение
решать?
возможно в силу своего ограниченного мировосприятия я понимаю задание
Напишите класс Stack, для которого можно сменить представление на стадии выполнения программы. Подсказка: "Любую проблему можно решить введя еще один уровень косвенности"
следующим образом: возьмите класс Stack и перепишите его таким образом что бы его методы стали виртуальными. тупо? да. однако 256 раз прогнав через кости это задание не приходит ничего красивее. они хотят сменить представление. под представлением я так понимаю они имеют ввиду сущность объекта. причем именно объекта Stack а не тех объектов которые он хранит. они хотят модифицировать его. хотят что бы наш абстрактный Stack вел себя по разному в зависимости от того как его расширили внутри программы.
1
ninja2
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:50  [ТС] #19
Цитата Сообщение от vxg Посмотреть сообщение
возьмите класс Stack и перепишите его таким образом что бы его методы стали виртуальными. тупо?
Так можно его не переписывать просто сделать наследование, у нас же может быть какой нить комерческий класс. Ну да виртуальные полюбом нужно делать методы, а то 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
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.09.2013, 14:54 #20
Цитата Сообщение от ninja2 Посмотреть сообщение
а то dynamic_cast<>() работать не будет
нам не нужно делать dynamic_cast. у нас будет абстрактный стек. и у него виртуальный метод, например, вставить. мы это метод расширим в классе, например, папка с файлами. расширим таким образом что бы вставка кроме стандартного поведения (обновления списка элементов стека) приводила к реальной вставке файла в папку. если мы создадим объект класса папка с файлами и передадим указатель на него в функцию которая принимает указатель на стек, то эта функция оперируя со стеком будет фактически обращаться к папке с файлами.
Цитата Сообщение от ninja2 Посмотреть сообщение
мы можем сделать наследование к классу у которого будет абстрактный член
зачем нам еще одно поле в классе? пусть даже абстрактного типа?
Цитата Сообщение от ninja2 Посмотреть сообщение
О еще вариант если Stack не полиморфный класс и мы его изменить не можем, то мы создаем класс свой Abstrakt_Stack полиморфный, от него делаем производный класс A : public Abstrakt_Stack, public Stack и B : public Abstrakt_Stack, public Stack эти классы будут размым представлением класса Stack и уже через указатель не Stack, а Abstrakt_Stack мы можем в реальном времени менять представление Stack. Этот прием видимо применяется для реальных библиотек которые нельзя изменить, но нужно расширить.
очень все запутано, что то тут у вас не так)
0
09.09.2013, 14:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 14:54
Привет! Вот еще темы с решениями:

stack
не могу норм прокомпилировать прогу, вот код, подскажите что не так! #include...

STACK STL
Будьте добры, обьясните(прокомментируйте) обозначеные строки кода на...

класс stack
Определите в программе класс stack, реализующий стек, который можно...

Контейнер stack
есть функция, которая возвращает контейнер stack(точнее ссылку на его верхний...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru