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

23 просмотра

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта