Э-э, я знаю, что это оооочищенный вопрос, но у меня была точно такая же проблема, и после прочтения всех предложенных ответов и комментариев я нашел немного другое решение.
Я думаю, что это также может быть подходящим для представленного здесь экземпляра проблемы, так что вот так:
Сделайте NullStartLogger типом объекта singleton !
Для меня это было довольно элегантно и вроде. Вкратце, синглтон - это объект, который вы не можете построить по своему желанию, поскольку только и только один экземпляр может существовать в любое время. (Как вариант, перед первым использованием может быть 0 экземпляров, так как вы можете отложить инициализацию). Конечно, вы можете добавить только одноэлементную функциональность в ваш производный класс, в то время как все другие экземпляры (и производные) родительского класса могут быть инициализированы и созданы нормально. Но если NullStatLogger
, как это было в моем случае, является просто фиктивным классом, он не хранит никаких данных извне и не ведет себя по-разному в зависимости от параметров экземпляра / инициализации, синглтон-класс подходит хорошо.
Вот короткий код, который делает ваш NullStatLogger
синглтоном, а также способ его использования в ThirdClass
:
class NullStatLogger : public StatLogger {
private:
NullStatLogger() : StatLogger() {}
static NullStatLogger *_instance;
public:
static NullStatLogger &instance();
};
NullStatLogger::_instance = 0;
NullStatLogger &NullStatLogger:instance() {
if (_instance == 0)
_instance = new NullStatLogger(); // constructor private, this is
// the only place you can call it
return *_instance; // the same instance always returned
}
class ThirdClass {
public:
ThirdClass(StatLogger& logger=NullStatLogger::instance());
};
Я знаю, что это точно не поможет тому, кто задал вопрос, но, надеюсь, это поможет кому-то еще.