Форум программистов, компьютерный форум, киберфорум С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377

Создание фабричного метода

08.01.2019, 16:36. Показов 1400. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой код:
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// #include <iostream>
#include <vector>
  
enum Warrior_ID { Infantryman_ID=0, Archer_ID, Horseman_ID };
  
// Иерархия классов игровых персонажей
class Warrior
{
  public:
    virtual void info() = 0;     
    virtual ~Warrior() {}
    // Параметризированный статический фабричный метод
    static Warrior* createWarrior( Warrior_ID id );
};
  
class Infantryman: public Warrior
{
  public:
    void info() { 
      cout << "Infantryman" << endl; 
    }
};
  
class Archer: public Warrior
{
  public:
    void info() { 
      cout << "Archer" << endl; 
    }
};
  
class Horseman: public Warrior
{
  public:    
    void info() { 
      cout << "Horseman" << endl; 
    } 
};
  
  
// Реализация параметризированного фабричного метода
Warrior* Warrior::createWarrior( Warrior_ID id )
{
    Warrior * p;
    switch (id)
    {
        case Infantryman_ID:
            p = new Infantryman();           
            break;      
        case Archer_ID:
            p = new Archer();           
            break;
        case Horseman_ID:
            p = new Horseman();           
            break;              
        default:
            assert( false);
    }
    return p;
};
  
  
// Создание объектов при помощи параметризированного фабричного метода
int main()
{    
    vector<Warrior*> v;
    v.push_back( Warrior::createWarrior( Infantryman_ID));
    v.push_back( Warrior::createWarrior( Archer_ID));
    v.push_back( Warrior::createWarrior( Horseman_ID));
  
    for(int i=0; i<v.size(); i++)
        v[i]->info();
    // ...
}
Всё ясненько, только вот объясните почему в 13й строке у нас фабрика в static и как * влияет на фабрику? =)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2019, 16:36
Ответы с готовыми решениями:

Компилятор выдает ошибку при использовании фабричного метода
Всем привет!!! новая ошибка... смотрите, теперь у меня есть класс template &lt;typename T&gt; struct Node{ T key; ...

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

Невозможно передать ArrayList в аргументы метода без модификатора static у этого метода или метода main
Крч, хочу передать экземпляр класса ArrayList в метод, но ide говорит, что нельзя это сделать, пока сам метод или main не будут в...

3
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.01.2019, 16:56
Лучший ответ Сообщение было отмечено cinekst_207 как решение

Решение

Цитата Сообщение от cinekst_207 Посмотреть сообщение
Всё ясненько, только вот объясните почему в 13й строке у нас фабрика в static
что бы его можно было вызвать не создавая объект, потому что фабричный метод сам создает объект.
Цитата Сообщение от cinekst_207 Посмотреть сообщение
и как * влияет на фабрику?
возвращает интерфейс Warrior*, который будет связывать с конкретным классом, Infantryman, Archer, Horseman

Добавлено через 1 минуту
cinekst_207, про абстрактные классы слышал? как тебе может быть все ясненько, если ты такие вопросы задаешь?
1
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
08.01.2019, 18:07  [ТС]
Не знал, что интерфейс должен быть объявлен типа (тип)*
0
зомбяк
 Аватар для TRam_
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
08.01.2019, 18:46
cinekst_207, это не интерфейс, это указатель на созданный объект. А static - это static-функция-фабрика. Которая генерирует указатель на новый объект.

Но вообще говоря в коде выше будет утечка памяти, если не сделать ручное удаление объектов по указателю или не переделать на вектор умных указателей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2019, 18:46
Помогаю со студенческими работами здесь

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

Создание метода
Всем здравствуйте. Помогите пожалуйста. Такая вот задача: создать метод в OfficeBuilding принимает в качестве параметра номер этажа ...

Создание метода
Добрый день. Такая проблема: надо создать метод setM такой, чтобы при вызове задавать ему строку setM(this,'('+m+'#-##-##'). Но вот как...

создание метода
Здравствуйте, подскажите пожалуйста как правильно написать метод Pk и вывести результат long Fact(int k)//факториал числа k ...

Создание метода в классе
Добрый день. Написал алгоритм чтения файла, в котором создаётся вектор объектов, но не получается сделать из этого алгоритма метод...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
PostgreSQL в Kubernetes: Подготовка кластера и настройка
Mr. Docker 20.03.2025
Когда доходит до контейнеризации баз данных и особенно таких требовательных к ресурсам системах как PostgreSQL, многие команды до сих пор колеблются, прежде чем перенести их в контейнерную. . .
C++26: Индексирование пакетов и метапрограммиро­вание
bytestream 20.03.2025
Эволюция C++ продолжается стремительными темпами – каждый новый стандарт приносит функциональность, о которой мы мечтали годами. Звучит слишком громко? Если вы когда-либо боролись с вариадическими. . .
Состояние гонки в C#: подводные камни многопоточного программировани­я
UnmanagedCoder 20.03.2025
Что такое состояние гонки? Это ситуация, когда результат программы непредсказуемо меняется в зависимости от порядка выполнения потоков. Проще говоря, два или более потока пытаются одновременно. . .
Next.js для разработки React: преимущества серверного рендеринга
Reangularity 20.03.2025
Next. js решает классическую проблему React-приложений: медленную первоначальную загрузку и плохую индексацию поисковиками. Вместо того чтобы заставлять браузер пользователя выполнять всю работу по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер