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

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

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

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

09.09.2013, 13:44. Просмотров 1220. Ответов 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; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 14:23     Stack со сменой представления #16
Цитата Сообщение от ninja2 Посмотреть сообщение
но смотрю ты тоже слабувато
у меня длиннее, ты же видишь цифры)
сейчас найдем оригинальный перевод и все заработает. нелишним было бы выбросить сюда и сам класс собственно
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:35  [ТС]     Stack со сменой представления #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, Мы можем сказать на неясность условия и сделать так как понимает, если кто спросит, скажем что в условии так было, я думаю гадать не нужно просто примерно сделать да и все.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 14:37     Stack со сменой представления #18
Цитата Сообщение от ninja2 Посмотреть сообщение
решать?
возможно в силу своего ограниченного мировосприятия я понимаю задание
Напишите класс Stack, для которого можно сменить представление на стадии выполнения программы. Подсказка: "Любую проблему можно решить введя еще один уровень косвенности"
следующим образом: возьмите класс Stack и перепишите его таким образом что бы его методы стали виртуальными. тупо? да. однако 256 раз прогнав через кости это задание не приходит ничего красивее. они хотят сменить представление. под представлением я так понимаю они имеют ввиду сущность объекта. причем именно объекта Stack а не тех объектов которые он хранит. они хотят модифицировать его. хотят что бы наш абстрактный Stack вел себя по разному в зависимости от того как его расширили внутри программы.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 14:50  [ТС]     Stack со сменой представления #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, Можно создать уровень косвенности для любого класса в иерархии классов и решить любую проблему .
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 14:54     Stack со сменой представления #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. Этот прием видимо применяется для реальных библиотек которые нельзя изменить, но нужно расширить.
очень все запутано, что то тут у вас не так)
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:06  [ТС]     Stack со сменой представления #21
Цитата Сообщение от 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<> не сможем применить. Нужно чтобы базовый класс обязательно был полиморфный.

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

Нужно поэкспериментировать.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:10     Stack со сменой представления #22
Цитата Сообщение от 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); //а мы даем ей вполне определенный стек
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:10  [ТС]     Stack со сменой представления #23
Цитата Сообщение от vxg Посмотреть сообщение
зачем нам еще одно поле в классе? пусть даже абстрактного типа?
Я там чуть ошибся, у которого будет базовый класс астрактный полиморфный, что бы можно было создать разные реализации класса Stack и проверять типы на стадии выполнения, без этого мы если просто сделаем наследование, от Stack который не полиморфный, мы не сможем видеть какие типы передаются. Вообще я запутался фиг его знает.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:12     Stack со сменой представления #24
Цитата Сообщение от ninja2 Посмотреть сообщение
проверять типы
зачем?
Цитата Сообщение от ninja2 Посмотреть сообщение
Вообще я запутался фиг его знает.
наверно
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:13  [ТС]     Stack со сменой представления #25
Цитата Сообщение от vxg Посмотреть сообщение
не надо так. надо так /код для демонстрации - возможны неточности/
То уже нужно смотреть, что нам нужно от взаимодействия классов их иерархию которую мы проектируем от по ней нужно смотреть делать нам так или нет.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:17     Stack со сменой представления #26
Цитата Сообщение от ninja2 Посмотреть сообщение
То уже нужно смотреть, что нам нужно от взаимодействия классов их иерархию которую мы проектируем от по ней нужно смотреть делать нам так или нет.
великая мудрость. как и у всех общих слов) это был код просто как иллюстрация того что мы друг другу пытаемся нечленораздельно сформулировать
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:25  [ТС]     Stack со сменой представления #27
Цитата Сообщение от 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 и для каждого нужно свои уникальные функции вызывать?

Это несколько вариантов их наверняка больше.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:28     Stack со сменой представления #28
Цитата Сообщение от ninja2 Посмотреть сообщение
и некоторые наследники будут не от Stack
а не надо так. точнее не так. можно наследовать хоть от 1001 класса, но программа должна строится таким образом что бы функции отдавали себе отчет в том с чем они работают и не использовали приведения. во всяком случае старались. если они используют приведение значит что то не так или задача очень специфичная (всем не угодишь)
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.09.2013, 15:29  [ТС]     Stack со сменой представления #29
Ну в принципе если их штук 30 будет то все можно в классе Stack определить сделать так это называется "Жирный интерфейс", но его я не помню точно вроде советуют избегать, хотя можно и так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 15:31     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'ом в несколько потоков?


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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
09.09.2013, 15:31     Stack со сменой представления #30
Цитата Сообщение от ninja2 Посмотреть сообщение
если их штук 30 будет
пусть их будет хоть 1001 и даже пусть они будут в разных классах, но при правильном проектировании у вас никогда не возникнет желание использовать все эти представления в одной функции - функция как правило будет работать с одним представлением и ей не нужно ничего приводить
Yandex
Объявления
09.09.2013, 15:31     Stack со сменой представления
Ответ Создать тему
Опции темы

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