Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

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

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

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

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

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

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

Объясните новичку!!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 13:44     Stack со сменой представления
Посмотрите здесь:

Циклические программы с регулярной сменой аргумента. - C++
Код С++ //_-------------------------------------------------------------------------- #include &lt;vcl.h&gt; #include &lt;math.h&gt; ...

Циклические программы с регулярной сменой аргумента, содержащие ветвления - C++
Помогите написать программу задачи. Плиз. Вывести на печать значения, удовлетворяют условию y&gt; 1.35 i y &lt;2.4, и соответствующие...

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

stack - C++
не могу норм прокомпилировать прогу, вот код, подскажите что не так! #include &lt;stack&gt; #include &lt;iostream&gt; int main() { const int...

Stack was corrupted - C++
Будьте добры, объясните, почему такая ошибку выдает: Run-Time Check Failure #2 - Stack around the variable 'My' was corrupted. ...

класс stack - C++
Всем привет))помогите пожалуйста....нужна прога на тему шаблоны функций и классов,при чём дан класс stack.Перегрузить операции &quot;+&quot;-добавить...

STACK STL - C++
Будьте добры, обьясните(прокомментируйте) обозначеные строки кода на правильную скобочную последовательность. #include &lt;iostream&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:32  [ТС]     Stack со сменой представления #31
Цитата Сообщение от vxg Посмотреть сообщение
а не надо так. точнее не так. можно наследовать хоть от 1001 класса, но программа должна строится таким образом что бы функции отдавали себе отчет в том с чем они работают и не использовали приведения. во всяком случае старались. если они используют приведение значит что то не так или задача очень специфичная (всем не угодишь)
Ну ладно тут уже от проектирования зависит как спроектируешь

Но для реальных наследников А B у них же разные методы, мыж не можем сделать все в базовом классе и тупо вызывать из функции f(Stack*) виртуальные функции, нам же мб нужно для некоторых типов и свои вызвать, так что без приведения не обойтись.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:37     Stack со сменой представления #32
Цитата Сообщение от ninja2 Посмотреть сообщение
без приведения не обойтись
обойтись. функция принимающая стек не может нагло полагать что ей передано что то иное. она не должна приводить. иначе эта функция неправильная. ну, или, она Особенная) бывает что и приходится приводить, но это ммммм... у меня был проект где объект содержал указатель на экстру - класс сам по себе ничего особенного не представляющий кроме наличия методов сохранения загрузки и поля "тип". а вот сама прога получив эту экстру доставала тип и начинала в зависимости от него приводить этот указатель ко всяким немыслиммым типам которые были настолько специфичны и непохожи друг на друга и чисто функционально не связанными друг с другом что их не нужно было сводить в один класс
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:38  [ТС]     Stack со сменой представления #33
Цитата Сообщение от vxg Посмотреть сообщение
но при правильном проектировании у вас никогда не возникнет желание использовать все эти представления в одной функции
Ну не знаю, правильное проектирование, это когда легко ориентироваться в программе, легко поддерживать проект, поэтому в правильных проектам может быть нужно будет приводить типы, проверять, хотя это мелочь в принципе в мелких проектах такое наврятли будет, да и над этими делами проектировщики задумываются, а мы же как бы "кодеры" это если брать весь процесс разработки, то программистам сильно думать не нужно .
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:41     Stack со сменой представления #34
Цитата Сообщение от ninja2 Посмотреть сообщение
программистам сильно думать не нужно
выдвигайте фразу в номинации девиз форума)
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:53  [ТС]     Stack со сменой представления #35
Цитата Сообщение от vxg Посмотреть сообщение
обойтись. функция принимающая стек не может нагло полагать что ей передано что то иное. она не должна приводить. иначе эта функция неправильная. ну, или, она Особенная) бывает что и приходится приводить, но это ммммм...
Да у стека не будет других свойств, но от щас попытаюсь привести пример "транспортное средство" абстрактный класс от него идет производный класс "машины", "самолеты", "корабли" и есть класс "ЭКСТРЕННЫЕ СЛУЖБЫ" и от у нас получается класс "МАШИНА СКОРОЙ ПОМОЩИ" производный от "машина" и от "экстренные службы", класс ПОЖАРНАЯ МАШИНА" производный от "машина" и "экстренные службы" и есть просто "ЛЕГКОВАЯ МАШИНА" от "машина" и "ГРУЗОВИК" от машина.

И есть функция fun(машина* p) и нам нужно в ней знать к какому классу машина относится если к службам то вызвать для них спецефические допустим виртуальные функции из "экстренных служб" и "машина", а если к машина, то просто функции "машина".

Тут от видно по любому придется приведение типов делать как не крути. Просто этими всеми делами в конторах обычно проектировщики занимаются, программистам то незачем за это думах, программисты это кодеры, проектировщик показывает что нужно делать - дает задание, написать то то, то то , относительно низкоуровневый код, а сам уже работает с более высокоуровневым кодом. Это не я так думаю это вычитал в книге про организацию контор по созданию программ.

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
выдвигайте фразу в номинации девиз форума)
Ну там имеется в веду если брать весь проект в целом, то программист отвечает за низкоуровневый код. А проектировщик за высокоуровневый.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:57     Stack со сменой представления #36
Цитата Сообщение от ninja2 Посмотреть сообщение
Да у стека не будет других свойств, но от щас попытаюсь привести пример "транспортное средство" абстрактный класс от него идет производный класс "машины", "самолеты", "корабли" и есть класс "ЭКСТРЕННЫЕ СЛУЖБЫ" и от у нас получается класс "МАШИНА СКОРОЙ ПОМОЩИ" производный от "машина" и от "экстренные службы", класс ПОЖАРНАЯ МАШИНА" производный от "машина" и "экстренные службы" и есть просто "ЛЕГКОВАЯ МАШИНА" от "машина" и "ГРУЗОВИК" от машина.
обосрать конечно каждый может поэтому не судите строго но на мой вкус тут что то не так. пожарная машина - это машина? да. а это служба? нет. значит она не может от нее наследовать. возможно служба должна быть абстрактным полем транспортного средства. или вообще входить в него
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 16:00  [ТС]     Stack со сменой представления #37
Цитата Сообщение от vxg Посмотреть сообщение
пожарная машина - это машина? да. а это служба? нет. значит она не может от нее наследовать. возможно служба должна быть абстрактным полем транспортного средства. или вообще входить в него
Да ты прав я ошибся, там просто сохраняем указатель на "ЭКСТРЕННЫЕ СЛУЖБЫ", потому что наследованием не нужно злоупотреблять, а нужно применять, только если есть логическая цепочка.

Добавлено через 1 минуту
Но это ничего не меняет, нам нужно вызвать через указатель свойства из экстренных служб, от уже нужно приведение типов, что бы знать что это скорая помощь или пажарная машина. Вообще машины разделить на две просто машины и служебные машины, ну ладно это мелочь, не цепляемся к деталям смысл я думаю понятен, где нужно применять приведение типов.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 16:03     Stack со сменой представления #38
Цитата Сообщение от ninja2 Посмотреть сообщение
Но это ничего не меняет
меняет. у нас будет абстрактная служба которая делает все что должна делать служба и нам не нужно будет знать конкретику - мы просто будем к ней обращатся
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 16:07  [ТС]     Stack со сменой представления #39
Цитата Сообщение от vxg Посмотреть сообщение
меняет. у нас будет абстрактная служба которая делает все что должна делать служба и нам не нужно будет знать конкретику - мы просто будем к ней обращатся
Ну в плане приведение типов не пропадет, нам полюбом нужно определять, токо уже не приводить к служба, а просто по типо "пожарная машина" или "скорая помощь".
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 16:11     Stack со сменой представления #40
Цитата Сообщение от ninja2 Посмотреть сообщение
приведение типов не пропадет
и где мы будем приводить? у нас остались просто машины которым может быть назначена или не назначена какая нибудь служба.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 16:12  [ТС]     Stack со сменой представления #41
А можно сделать уровень косвенности как нам советуют "Любую проблему можно решить введя еще один уровень косвенности" например Car_service в котором будет хранится указатель на службы создать виртуальные методы и от него создать наследников пажарная машина, скорая помощь.
Это делается для удобства что бы одну проверку делать в приведении типов Car_service* p=dynamic_cast<Car_service*>( "машины" *) и потом уже вызвать виртуальные функции, потому что у нас служебных машин может быть очень много и для каждой делать проверку это утомительно.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 16:13     Stack со сменой представления #42
не легче ли просто проверить нулевой указатель у службы или нет? или если нужно отобрать машины одной службы сравнить имена служб?
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 16:15  [ТС]     Stack со сменой представления #43
Цитата Сообщение от vxg Посмотреть сообщение
и где мы будем приводить? у нас остались просто машины которым может быть назначена или не назначена какая нибудь служба.
Ну как где в функции которая будет использовать эти машины в f(car* ) например.

Ладно проехали эта тема на вкус и цвет, кто как хочет так и ***чит. Смысл поняте.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.09.2013, 16:18     Stack со сменой представления #44
Вообще, представление непосредственно в программировании встречается, насколько я понимаю, лишь в одном контексте (MVC - Model View Controller, оно же Модель Представление (вид) Поведение). Так же вполне возможно что имеется ввиду смена внутреннего поведения на этапе выполнения (читай использование некого интерфейса). Т.е. нечто вроде

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class AbstractStack {};
class ListStack : public AbstractStack {};
class ArrayStack : public AbstractStack {};
class Stack
{
public:
    Stack(AbstractStack* impl) : impl_(impl)
    {
    }
    void set(AbstractStack* new_impl)
    {
        impl_ = new_impl;
    }
private:
    AbstractStack* impl_;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 16:24     Stack со сменой представления
Еще ссылки по теме:

Удаление в stack - C++
Помогите пожалуйста решите проблему. Мне надо создать структуру данных через stack void stack :: add(printer addp) { qelem...

STL stack - C++
не мог бы кто нить обьяснить этот код!Гуглил и нашел!не могли бы комменты поставить По идее так должен выводить! Ввод ...

Stack и указатели c++ - C++
Есть следующий Стэк #ifndef _LINKED_STACK #define _LINKED_STACK #include &quot;StackInterface.h&quot; #include &quot;Node.h&quot; template &lt;...

Создание stack - C++
Выдаёт ошибку на создание стека почему-то. Не могу понять, почему именно. Вот сама ошибка: error C2143: синтаксическая ошибка:...

stack, потоки - C++
Добрый день! Является ли безопасным одновременная работа с stl'ным stack'ом в несколько потоков?


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

Или воспользуйтесь поиском по форуму:
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 16:24  [ТС]     Stack со сменой представления #45
Цитата Сообщение от vxg Посмотреть сообщение
не легче ли просто проверить нулевой указатель у службы или нет? или если нужно отобрать машины одной службы сравнить имена служб?
Ну тыж видешь когда мы создадим косвенный класс car_service, то у нас у "пажарной машины" пропадет указатель просто появятся виртуальные функции из car_service, мы их вызовем и все. А таких наследников от car_servise может быть очень много и у каждого будет свои перегруженные функции. Прикинь какое удобство не знать за 30 функций ничего и тремя строчками кода вызывать нужную функцию, это прекрасно.

Добавлено через 6 минут
ForEveR, Ну как вариант пойдет.
Yandex
Объявления
09.09.2013, 16:24     Stack со сменой представления
Ответ Создать тему
Опции темы

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