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

Factory Method - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ подскажите пожалуйста как на ТС++ 3.0 сделать резидентную программу??? http://www.cyberforum.ru/cpp-beginners/thread56445.html
ВСЕМ здравствуйте, подскажите пожалуйста как сделать на ТС 3.0 резидентную программу??? пробывал вставлять ассемблерный код, ничего не получается кроме ошибки (повидимому винда защищает от нелегального доступа к памяти) заранее благодарен :)
C++ MSDN vsem privet... xochu naiti russkiy MSDN..no nekak ne mogu...daite pojaluysta ssilku na MSDN...(xochu skachat). http://www.cyberforum.ru/cpp-beginners/thread56439.html
недоработка С++ или ошибочная логика C++
Помогите если возможно понять почему в моем коде нельзя проделать такую операцию: class First { int a; protected: string name; public: virtual void setName(string smth)=0;
Найти все натуральные числа, не превосходящие заданного n, которые делятся на каждую из своих цифр C++
программа 1. Найти все натуральные числа, не превосходящие заданного n, которые делятся на каждую из своих цифр. Программа 2. Программа для перевода данного натуральномбо числа в р-ную систему счисления (2, 8, 16) Именуйте темы осмысленно. Название темы должно максимально полно отражать ее содержимое.
C++ Нужно вытащить из массива... http://www.cyberforum.ru/cpp-beginners/thread56385.html
Нужно вытащить из массива из шести элементов (0,1,2,3,4,5) все чётные числа. Помогите плиз. Заранее благодарю!
C++ Определить, состоит ли число из четных и нечетных цифр В диалоговом режиме задается целое длинное число A. Для решения каждой из трех задач использовать функции: 1. Найти наибольшую нечетную цифру. Если ее нет, возвратить 0. 2. Определить, состоит ли число из четных и нечетных цифр. 3. Найти количество простых цифр. подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
14.10.2009, 21:17
Класс Product - абстрактный класс, определяющий интерфейс. Абстрактный - значит, создавать экземпляры этого класса нельзя, создавать можно только его потомков. virtual обозначает функцию, которая вызывается через таблицу. =0 означает, что виртуальный метод не определён (это и делает класс абстрактным). В объекте хранится информация о таких функциях, позволяющая осуществлять их вызов (указатель на таблицу виртуальных методов, но сейчас это неважно). Чтобы потомок такого класса можно было создать, в нём должны быть определены все занулённые в предках виртуальные функции, тогда такой класс станет конкретным и можно будет создавать его объекты.
В твоём случае можно создавать объекты классов ConcreteProductA и ConcreteProductB, а обращаться к этим объектам через указатель на класс Product. Обрати внимание - фактические типы объектов разные, а обращение к ним происходит через указатель одного и того же типа. Это называется полиморфизм - возможность одинаковым образом работать с объектами разных типов. При этом благодаря тому самому virtual при обращении к getName будет происходить обращение именно к той функции, которую переопределил класс-потомок. Аналогичным образом определён класс-создатель для продуктов и его потомки - создатели для продуктов A и B. В функции main создаётся массив из 2 указателей на создателя-предка, но создаётся не сам предок Creator, а два его разных потомка. Поскольку они оба произошли от Creator, указатели на эти объекты легко преобразуются к типу указателя на предка. Затем по очереди у каждого из этих объектов вызывается виртуальный метод, создающий продукт. Поскольку объекты разные, а метод виртуальный, вызывается сначала ConcreteCreatorA::FactoryMethod(), а потом ConcreteCreatorB::FactoryMethod(). В результате на первом шаге локальному указателю на Product присваивается адрес на свежесозданного ConcreteProductA, а на втором шаге - ещё более свеженького ConcreteProductB. Оба указателя неявно приводятся к типу Product. Затем происходит вызов виртуального метода getName, а раз он виртуальный, то вызывается метод, который определён в реальном классе объекта. Таким образом, сначала печатается "ConcreteProductA", а затем - "ConcreteProductB".
Общий подход таков: допустим, у тебя есть набор различных, но родственных по смыслу объектов. Ты определяешь некоторый абстрактный класс-интерфейс. В нём ты определяешь ТОЛЬКО виртуальные методы, соответствующие общим для всех объектов операциям. Делаешь их чистыми (т.е. =0) и не определяешь. Делаешь свои конкретные классы потомками этого интерфейса и определяешь там нужные для них данные, дополнительные операции, и определяешь ВСЕ операции интерфейса так, чтобы они правильно работали именно с этим классом. Дальше ты можешь собрать в одну коллекцию объекты разного типа и размера, пользуясь указателями на их общий предок. Ты можешь пройтись по всей коллекции циклом, вызывая какую-то из операций, определённых в интерфейсе. При этом за счёт волшебного слова virtual для каждого объекта из коллекции будет автоматически вызываться операция, определённая в его классе.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru