Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

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

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

Author24 — интернет-сервис помощи студентам
Здорова господа!!!

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

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

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

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

Объясните новичку!!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2013, 13:44
Ответы с готовыми решениями:

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' ...

Есть ли связь между STL-stack и stack - высокопроизводительная память?
Куча источников, как всегда много отсебятины, в общем я запутался...

error C2440: 'return' : cannot convert from 'stack<X>' to 'stack<X> *'
Пишу класс PersonKeeper, в нем readPersons(должен считывать информацию о людях из входного потока...

Как получить нужные данные из представления , а именно строки представления
Доброго времени суток. на главной форме у меня информация выводится через представление zews......

51
Модератор
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
Цитата Сообщение от vxg Посмотреть сообщение
объяснение простое - я тоже ничего не понял, составитель задания был большой оригинал или хочет вырастить из вас моцарта
Так может просто у вас знаний не хватает, что бы понять что имелось в веду в задании? Задание на проектирование классов ООП, что бы понять нужно хорошо знать шаблоны проектирования!

Добавлено через 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
Цитата Сообщение от vxg Посмотреть сообщение
мой вариант - спросить у преподавателя чего ему нужно.
Нет это задание из книги Страуструпа.
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
Цитата Сообщение от vxg Посмотреть сообщение
вот, например, познакомьтесь с выдержкой из книги Бьерн Страуструп. Язык программирования С++
"Унарная операция * называется косвенностью (или операцией
разыменования), она выбирает значение объекта, на который настроен
указатель." - я в шоке. кто бы мог подумать о таком применении великого русского языка. оказывается волей перевода (а может это как раз был очень умный переводчик и беда в том что все остальные переводчики были глупы) операция разыменования была названа косвенностью. хотя в этом тексте она как то слабо нахлобучиваеся на вашу песню
Да что тут не ясного просто косвенно операция * вызывает operator*() или глобально operator*(тип, тип). Получается косвенно умножает или разыменовывает через вызовы функций.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
09.09.2013, 14:16 10
Цитата Сообщение от ninja2 Посмотреть сообщение
что тут не ясного
неясно зачем разыменование называть косвенность (вообще ни рода ни падежа - что за зверь неясно) и зачем подразумевать у этой косвенности уровень (что за уровень? да это же просто еще одно разыменование ой ла ла). переводчика - к стене. книгу... (защищается от молнии) - в топку - как вариант: читать в оригинале без загонов перевода
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
Цитата Сообщение от vxg Посмотреть сообщение
и зачем подразумевать у этой косвенности уровень
ну смотри если мы что касается задачи, если мы обращаемся через посредник к классу, то мы как бы косвенно к им манипулируем, если на прямую то это уже не косвенно. Уровень косвенности создать еще один, я думаю нужно просто наследования сделать от 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
Цитата Сообщение от vxg Посмотреть сообщение
таким образом видим что ваш перевод вообще нельзя сделать ибо во время выполнения вы представление (тоже хз что это означает - предположим что имеется ввиду реализация) не измените. короче хх
ну походу ты не знаешь что такое RTTI.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
09.09.2013, 14:23 16
Цитата Сообщение от ninja2 Посмотреть сообщение
но смотрю ты тоже слабувато
у меня длиннее, ты же видишь цифры)
сейчас найдем оригинальный перевод и все заработает. нелишним было бы выбросить сюда и сам класс собственно
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
09.09.2013, 14:37 18
Цитата Сообщение от ninja2 Посмотреть сообщение
решать?
возможно в силу своего ограниченного мировосприятия я понимаю задание
Напишите класс Stack, для которого можно сменить представление на стадии выполнения программы. Подсказка: "Любую проблему можно решить введя еще один уровень косвенности"
следующим образом: возьмите класс Stack и перепишите его таким образом что бы его методы стали виртуальными. тупо? да. однако 256 раз прогнав через кости это задание не приходит ничего красивее. они хотят сменить представление. под представлением я так понимаю они имеют ввиду сущность объекта. причем именно объекта Stack а не тех объектов которые он хранит. они хотят модифицировать его. хотят что бы наш абстрактный Stack вел себя по разному в зависимости от того как его расширили внутри программы.
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
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
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2013, 14:54
Помогаю со студенческими работами здесь

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

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

Переустановка со сменой разрядности
Здравствуйте! Очень интересует такой вопрос: Имеем установленную Windows 7, ну жно переустановить...

Работа со сменой картинки
Заметил кучу мертвых тем... Неужели никто не хочет рассказать как таки вставить картинку в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru