Calculator& obj);
Calculator(Calculator&& obj);
Calculator& operator=(const Calculator& obj);
Calculator& operator=(Calculator&& obj);
virtual ~Calculator();
virtual double calculate(const std::string& expression);
protected:
virtual double expr();
virtual double term();
virtual double prim();
std::set<std::pair<std::string, double>> _variables;
calculator::ExpressionParser* _parser = new calculator::ExpressionParser();
};
В этом классе есть протектед поле типа парсера, который является базовым классом для парсеров. Смысл в том, что если я захочу написать новый калькулятор с поддержкой новых функций, то я унаследуюсь от текущего калькулятора, а также сделаю наследника парсера, т.к. скорее всего появится дополнительный набор операций в калькуляторе. Тогда калькулятор-наследник будет в данном поле хранить указатель на парсер-наследник.
У меня вопрос по поводу создания объекта парсера в конструкторе калькулятора. Когда будет вызван конструктор наследника калькулятора, то будет вызван конструктор базового класса, который создаст new calculator::ExpressionParser(), но при этом в конструкторе наследника мне нужно создать необходимый ему тип парсера. Если я правильно все понимаю, то память под new calculator::ExpressionParser() уже будет выделена и мне нужно будет её очистить в конструкторе наследника и создать новый нужный парсер?
Советую вместо использования сырого указателя обернуть в умный, конкретнее - в std::unique_ptr, в конструкторе базового калькулятора сделать make_unique<calculator::ExpressionParser>() в конструкторе наследника - make_unique<calculator::DerivedExpressionParser>(), а из заголовочника убрать = new calculator::ExpressionParser(); - тогда твой вопрос перестанет быть актуальным
можешь вызывать явно дефолтный конструктор из базового типа и или любой другой, нужный тебе, например вызывать конструктор передав нужный парсер
Спасибо, попробую) Но все равно хотел бы уточнить, правильно ли я понял, что память под new calculator::ExpressionParser() будет выделена в кон. базового класса и в кон. наследника надо будет ее очистить и присвоить новое значение?
Да, можно было б, но просто нет смысла в таком конструкторе, т.к. калькулятор должен сам точно создать объект нужного ему парсера
Ты можешь её не освобождать, но тогда получишь утечку памяти. Вариант с unique_ptr тоже сначала очистит старое значение, просто сам, тебе не надо будет это делать руками
Обсуждают сегодня