170 похожих чатов

У меня есть такой базовый класс калькулятора: class Calculator { public: Calculator(const

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() уже будет выделена и мне нужно будет её очистить в конструкторе наследника и создать новый нужный парсер?

6 ответов

6 просмотров

Советую вместо использования сырого указателя обернуть в умный, конкретнее - в std::unique_ptr, в конструкторе базового калькулятора сделать make_unique<calculator::ExpressionParser>() в конструкторе наследника - make_unique<calculator::DerivedExpressionParser>(), а из заголовочника убрать = new calculator::ExpressionParser(); - тогда твой вопрос перестанет быть актуальным

можешь вызывать явно дефолтный конструктор из базового типа и или любой другой, нужный тебе, например вызывать конструктор передав нужный парсер

Yevhenii-Яремченко Автор вопроса
Vadim Ushakov
Советую вместо использования сырого указателя обер...

Спасибо, попробую) Но все равно хотел бы уточнить, правильно ли я понял, что память под new calculator::ExpressionParser() будет выделена в кон. базового класса и в кон. наследника надо будет ее очистить и присвоить новое значение?

Yevhenii-Яремченко Автор вопроса
Kelbon
можешь вызывать явно дефолтный конструктор из базо...

Да, можно было б, но просто нет смысла в таком конструкторе, т.к. калькулятор должен сам точно создать объект нужного ему парсера

Yevhenii Яремченко
Спасибо, попробую) Но все равно хотел бы уточнить,...

Ты можешь её не освобождать, но тогда получишь утечку памяти. Вариант с unique_ptr тоже сначала очистит старое значение, просто сам, тебе не надо будет это делать руками

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Карта сайта