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

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

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

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

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

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

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

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

Объясните новичку!!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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;' #pragma hdrstop #pragma argsused ...

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

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

51
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 15:06  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vxg Посмотреть сообщение
нам не нужно делать dynamic_cast. у нас будет абстрактный стек. и у него виртуальный метод, например, вставить. мы это метод расширим в классе, например, папка с файлами. расширим таким образом что бы вставка кроме стандартного поведения (обновления списка элементов стека) приводила к реальной вставке файла в папку. если мы создадим объект класса папка с файлами и передадим указатель на него в функцию которая принимает указатель на стек, то эта функция оперируя со стеком будет фактически обращаться к папке с файлами.
Ну да нам не нужно тут проверять dynamic_cast<> тут мы просто другой тип не передадим,

А от в варианте что я описал через указатель на Abstrakt_Stack нужно проверять обязательно, потому что мы можем определить класс C : public Abstrakt_Stack и не сделать еще : public Stack и если мы без dynamic_cast<>() обратимся к указателю Abstrakt_Stack а он будет указывать на объект C который не есть Stack и вызовем методы Stak() то будет ошибка, тут нужно обязательно проверять.

Добавлено через 5 минут
Цитата Сообщение от vxg Посмотреть сообщение
очень все запутано, что то тут у вас не так)
Ну если Stack без виртуальных функций, то dynamic_cast<>() нельзя к такому классу применить. Мы можем от Stack унаследовать много классов, но проверять мы не сможем какой тип передается через указатель Stack*, от если Stack без виртуальных функций, мы делаем производные классы А, B и через указатель и есть fun(Stack* s) и мы передаем допустим в функцию указатель на А , f(new A()) то мы уже не сможем в самой функции видеть какой это класс А или B dynamic_cast<> не сможем применить. Нужно чтобы базовый класс обязательно был полиморфный.

Я возможно ошибаюсь, не сильно в этом шарю.

Нужно поэкспериментировать.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 15:10
Цитата Сообщение от ninja2 Посмотреть сообщение
А от в варианте что я описал через указатель на Abstrakt_Stack нужно проверять обязательно, потому что мы можем определить класс C : public Abstrakt_Stack и не сделать еще : public Stack и если мы без dynamic_cast<>() обратимся к указателю Abstrakt_Stack а он будет указывать на объект C который не есть Stack и вызовем методы Stak() то будет ошибка, тут нужно обязательно проверять.
не надо так. надо так /код для демонстрации - возможны неточности/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tempate <class type>
class abs_stack:
{
public:
    virtual void push(type obj); //что то стандарртое, может даже ничего ( = 0; )
};
 
template <class type>
class my_stack: public abs_stack
{
public:
    virtual void push(type obj); //что то специфичное, как вариант - в числе прочего делающее что то стандартное либо само по себе либо посредством вызова родительского метода
};
 
void my_func(abs_stack *a); //ф-я которая делает что то со стеком - ей без разницы что это за стек
 
my_stack a;
my_func(&a); //а мы даем ей вполне определенный стек
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 15:10  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
зачем нам еще одно поле в классе? пусть даже абстрактного типа?
Я там чуть ошибся, у которого будет базовый класс астрактный полиморфный, что бы можно было создать разные реализации класса Stack и проверять типы на стадии выполнения, без этого мы если просто сделаем наследование, от Stack который не полиморфный, мы не сможем видеть какие типы передаются. Вообще я запутался фиг его знает.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 15:12
Цитата Сообщение от ninja2 Посмотреть сообщение
проверять типы
зачем?
Цитата Сообщение от ninja2 Посмотреть сообщение
Вообще я запутался фиг его знает.
наверно
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 15:13  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
не надо так. надо так /код для демонстрации - возможны неточности/
То уже нужно смотреть, что нам нужно от взаимодействия классов их иерархию которую мы проектируем от по ней нужно смотреть делать нам так или нет.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 15:17
Цитата Сообщение от ninja2 Посмотреть сообщение
То уже нужно смотреть, что нам нужно от взаимодействия классов их иерархию которую мы проектируем от по ней нужно смотреть делать нам так или нет.
великая мудрость. как и у всех общих слов) это был код просто как иллюстрация того что мы друг другу пытаемся нечленораздельно сформулировать
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 15:25  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
зачем?
Как зачем? А если у нас будет много наследников от Abstrakt_Stack и некоторые наследники будут не от Stack, а допустим от List и ты что в fun(Abstrakt_Stack*) определишь, что это не стек, а List ??? Без dynamic_cast<>() ты этого не сделаешь. Это я просто пример навел если будет такое.

Ну и еще пример без Abstrakt_Stack, просто с Stack ты поделал от него наследование и некоторым классам ты сделал двойное наследование расширил например A : public Stack, public List и тебе нужно в f(Stack*) знать что это именно класс A а не какой то там B, для того что бы вызвать специфические функции из класса List.

А от еще пример если ты просто сделал наследование от Stack производные классы А и производный класс B, в классе А есть метод print_A(), в классе B есть метод fff_B() специфические для производных классов, есть функция f(Stack* p) и ты должен в ней вызвать разные функции проверить если if(A*pp=dynamic_cast<A*>(p)) pp->print_A(); if(B* pp=dynamic_cast<B*>(p)) pp->fff_B(). Ну и как ты это все реализуешь без dynamic_cast ??? все в классе Stack определишь? А если производных классов у тебя будет не один, а 30 и для каждого нужно свои уникальные функции вызывать?

Это несколько вариантов их наверняка больше.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 15:28
Цитата Сообщение от ninja2 Посмотреть сообщение
и некоторые наследники будут не от Stack
а не надо так. точнее не так. можно наследовать хоть от 1001 класса, но программа должна строится таким образом что бы функции отдавали себе отчет в том с чем они работают и не использовали приведения. во всяком случае старались. если они используют приведение значит что то не так или задача очень специфичная (всем не угодишь)
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 15:29  [ТС]
Ну в принципе если их штук 30 будет то все можно в классе Stack определить сделать так это называется "Жирный интерфейс", но его я не помню точно вроде советуют избегать, хотя можно и так.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 15:31
Цитата Сообщение от ninja2 Посмотреть сообщение
если их штук 30 будет
пусть их будет хоть 1001 и даже пусть они будут в разных классах, но при правильном проектировании у вас никогда не возникнет желание использовать все эти представления в одной функции - функция как правило будет работать с одним представлением и ей не нужно ничего приводить
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 15:32  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
а не надо так. точнее не так. можно наследовать хоть от 1001 класса, но программа должна строится таким образом что бы функции отдавали себе отчет в том с чем они работают и не использовали приведения. во всяком случае старались. если они используют приведение значит что то не так или задача очень специфичная (всем не угодишь)
Ну ладно тут уже от проектирования зависит как спроектируешь

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
выдвигайте фразу в номинации девиз форума)
Ну там имеется в веду если брать весь проект в целом, то программист отвечает за низкоуровневый код. А проектировщик за высокоуровневый.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 15:57
Цитата Сообщение от ninja2 Посмотреть сообщение
Да у стека не будет других свойств, но от щас попытаюсь привести пример "транспортное средство" абстрактный класс от него идет производный класс "машины", "самолеты", "корабли" и есть класс "ЭКСТРЕННЫЕ СЛУЖБЫ" и от у нас получается класс "МАШИНА СКОРОЙ ПОМОЩИ" производный от "машина" и от "экстренные службы", класс ПОЖАРНАЯ МАШИНА" производный от "машина" и "экстренные службы" и есть просто "ЛЕГКОВАЯ МАШИНА" от "машина" и "ГРУЗОВИК" от машина.
обосрать конечно каждый может поэтому не судите строго но на мой вкус тут что то не так. пожарная машина - это машина? да. а это служба? нет. значит она не может от нее наследовать. возможно служба должна быть абстрактным полем транспортного средства. или вообще входить в него
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 16:00  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
пожарная машина - это машина? да. а это служба? нет. значит она не может от нее наследовать. возможно служба должна быть абстрактным полем транспортного средства. или вообще входить в него
Да ты прав я ошибся, там просто сохраняем указатель на "ЭКСТРЕННЫЕ СЛУЖБЫ", потому что наследованием не нужно злоупотреблять, а нужно применять, только если есть логическая цепочка.

Добавлено через 1 минуту
Но это ничего не меняет, нам нужно вызвать через указатель свойства из экстренных служб, от уже нужно приведение типов, что бы знать что это скорая помощь или пажарная машина. Вообще машины разделить на две просто машины и служебные машины, ну ладно это мелочь, не цепляемся к деталям смысл я думаю понятен, где нужно применять приведение типов.
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 16:03
Цитата Сообщение от ninja2 Посмотреть сообщение
Но это ничего не меняет
меняет. у нас будет абстрактная служба которая делает все что должна делать служба и нам не нужно будет знать конкретику - мы просто будем к ней обращатся
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.09.2013, 16:07  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
меняет. у нас будет абстрактная служба которая делает все что должна делать служба и нам не нужно будет знать конкретику - мы просто будем к ней обращатся
Ну в плане приведение типов не пропадет, нам полюбом нужно определять, токо уже не приводить к служба, а просто по типо "пожарная машина" или "скорая помощь".
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,476
09.09.2013, 16:11
Цитата Сообщение от ninja2 Посмотреть сообщение
приведение типов не пропадет
и где мы будем приводить? у нас остались просто машины которым может быть назначена или не назначена какая нибудь служба.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.09.2013, 16:11

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

Ошибка: "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 &lt;stack&gt; //-std=c++14...

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru