Материалы книги получены с http://www.itlibitum.ru/
Символические классы и перегруженные make-функции
Все эти функции makeFoo расходятся с перегружаемой природой С++, не правда ли? Следующий фрагмент помогает выбрать нужную версию make.
class Variation Dad {}; // Пустое объявление класса
class VariationAuntieEm {};
class Grandpa {
public:
static Grandpa* make(VariationDad);
static Grandpa* make(VariationAuntieEm);
};
// В вашей программе
Grandpa* g = Grandpa::make(VariationDad());
Вызов VariationDad() создает анонимный экземпляр (anonymous instance) класса VariationDad - то есть экземпляр, не связанный ни с какой переменной в исходной области действия. Он живет лишь столько, сколько необходимо для вызова, а затем исчезает. Экземпляр VariationDad нужен лишь для одного - он сообщает компилятору, какая перегруженная версия make должна вызываться. Класс, который не имеет членов и используется подобным образом, называется символическим классом (symbol class). Он играет ту же роль, что и символический тип данных в языках типа Lisp: строка, которая заранее компилируется в более эффективную форму.
Поскольку производные классы все равно инкапсулированы в файле .cpp, мы можем воспользоваться этим обстоятельством и заменить имя исходного Dad другим локальным по отношению к файлу .cpp, а затем просто воспользоваться Dad вместо VariationDad в файле .h.
Назад Содержание Далее
|