|
Символические классы и перегруженные 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. |
Copyright 2005. Климов Александр. All Right Reserved.