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

Альтернатива виртуальным функциям в конструкторе - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Область видимости, пространства имен http://www.cyberforum.ru/cpp-beginners/thread858837.html
имею макрос #define max(a,b) (((a) > (b)) ? (a) : (b)) он определен в Windows.h, который мне нужен в проекте... также мне нужна это строчка в коде cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); вопрос...каким с чего компилятор решил, что мне нужно использовать макрофункцию?..и как это вылечить?..) пишет ошибку, что нехватает параметров
C++ Из двух стеков с упорядоченными по возрастанию элементами создать новый стек с упорядоченными элементами, не удаляя исходные стеки Здравствуйте. Помогите пожалуйста с программой Из двух стеков с упорядоченными по возрастанию элементами создать новый стек с упорядоченными элементами, не удаляя исходные стеки. Программу реализовать с помощью массивов и односвязных списков. С помощью массивов я сделал. Помогите реализовать это все с помощью списков. #include <iostream> using namespace std; int main() { setlocale (... http://www.cyberforum.ru/cpp-beginners/thread858826.html
C++ Бинарное дерево. Каждую вершину с чётным номером поменять местами с сыном, имеющим чётный номер
Помогите написать функцию которая меняет местами вершины с сыновьями с чётными номерами #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; struct Node { int num; Node* Left; Node* Right;
C++ Получить сумму членов исходной последовательности
Даны действительные числа а1,а2,…,аn.Если в результате замены отрицательных членов последовательности а1,а2,…,аn их квадратами члены будут образовывать неубывающую последовательность, то получить сумму членов исходной последовательности; в противном случае получить их произведение.
C++ Разреженная матрица http://www.cyberforum.ru/cpp-beginners/thread858790.html
Разреженной матрице CSR найти количество её различных элементов и вывести их на экран
C++ опишите программу Помогите пожалуйста.. опишите подробно что делает эта программа. #include <iostream> #include <fstream> using namespace std; int main() { ifstream f("a.txt"); FILE *l=fopen ("b.txt","w"); while (!f.eof()) { подробнее

Показать сообщение отдельно
ZiminAS1990
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
07.05.2013, 23:12     Альтернатива виртуальным функциям в конструкторе
Доброе время суток, коллеги!

В процессе разработки одной библиотечки столкнулся с такой проблемой:

Допустим есть базовый класс Popcorn. Когда я создаю Popcorn, он "приготавливается" прямо в своём конструкторе: засыпается кукуруза, включается печь, добавляется некоторый ингредиент и т.д.
Я хочу предложить своим довольным покупателям аж три разных попкорна: простой, солёный и сладкий. Разница лишь в ингредиенте, добавляемым в процессе приготовления.
Как это можно представить с точки зрения ООП:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Popcorn {
public:
  Popcorn() {
    // Начинаем приготовление...
    // Добавляем ингредиент:
    addIngredient(getIngredient());
    // Завершаем приготовление...
  }
 
protected:
  // Получить ингредиент, который будет добавлен:
  virtual Ingredient getIngredient() {
    // В простом попкорне ничего не добавляем
    return noIngredient;
  }
 
private:
  // Добавить ингредиент к попкорну
  void addIngredient(Ingredient ingredient);
 
};
Как видите, "изюминка" класса - виртуальная функция getIngredient, которая возвращает ингредиент, который должен быть добавлен в процессе приготовления.
Теперь я хочу сделать сладкий и солёный попкорн. Поэтому я делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SweetPopcorn : public Popcorn {
  ...
protected:
  virtual Ingredient getIngredient() {
    // В сладком попкорне добавляем сахар
    return Sugar;
  }
 
};
 
 
class SaltPopcorn : public Popcorn {
  ...
protected:
  virtual Ingredient getIngredient() {
    // В солёном попкорне добавляем соль
    return Salt;
  }
 
};
Естественно, это работать не будет, так как при приготовлении как сладкого, так и солёного попкорна, функция getIngredient вернёт нам ничего (noIngredient) и две трети моих покупателей больше ко мне не вернуться
Как это обойти?

Повторюсь, что пример вырожденный. Можно было конечно всё сделать иначе....
Например ингредиент можно было добавить в конструктор Popcorn и вообще ничего не наследовать. Но тогда покупатели вместо "Будьте добры простой попкорн" вынуждены будут говорить "Будьте добры попкорн с добавлением ничего".
Можно было процесс приготовления вынести из конструктора в функцию "Cook" и вызывать её после создания объекта, но это всё равно, что сказать: "Вот Ваш попкорн, вон там в углу стоит микроволновка. Положите пакет в микровоновку на три минуты и получите свой попкорн. Спасибо за покупку!".
Можно было бы создать три разных класса без наследования, и в конструкторах прописать процесс приготовления с добавлением нужного ингредиента. Но это всё равно что поставить рядом три лавки и три продавца, которые будут продавать три разных попкорна.

Короче, как бы сделать так, что если я создаю объект SweetPopcorn, то я получаю своё сладкий попкорн без дополнительных телодвижений и параметров в конструкторах?

Заранее благодарю за ответы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru