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

20 просмотров

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

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Всем привет! Кто пользуется DevExpress, подскажите пожалуйста, реализован ли в TcxGrid в новых версиях поиск по датам как в Экселе (ну т.е. не просто список чекбоксов со значе...
A Z
4
Карта сайта