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 ответов

21 просмотр

Советую вместо использования сырого указателя обернуть в умный, конкретнее - в 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 тоже сначала очистит старое значение, просто сам, тебе не надо будет это делать руками

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта