Перегрузка+ оператор в C ++ для класса символов и избегание дублирования кодаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перегрузка+ оператор в C ++ для класса символов и избегание дублирования кода

Сообщение Anonymous »

Я создаю бинарное представление дерева математического выражения для выполнения различных и интеграции. Это отлично работает для: < /p>
Symbol("x") + Symbol(2.3);
< /code>
Проблема возникает, когда я хочу поддерживать такие выражения, как: < /p>
Symbol("x") + 2.3;
< /code>
Где объект символа добавляется в двойную (плавающую запятую). < /p>
Я реализовал два подхода:
подход 1 (работает, но имеет дублирование кода) < /strong> < /p>
Symbol operator+(double other){
Symbol *temp = new Symbol(other);
if (this->is_constant) {
double value = this->value + temp->value;
Symbol temp2(value);
return temp2;
}

Symbol temp2;
temp2.op = '+';
temp2.left = this;
temp2.right = temp;

return temp2;

}
< /code>
Это работает, но логика для добавления двух объектов символа практически идентична этой функции, что приводит к избыточному коду. < /p>
подход 2 (вызывает ошибку сегментации) < /strong>
, чтобы уменьшить избыточность, я пытался: < /p>
< /strong>
, я пытался: < /p>

< /rong>
, я пытался: < /p>

< /strong>
.Symbol operator+(double other){
Symbol *temp = new Symbol(other);
return *this + *temp; // Causes segmentation fault when try to access other later
}
< /code>
Symbol("x") + 2.3
Тем не менее, это приводит к ошибке сегментации, когда пытайтесь получить доступ к этому *Temp (2.3) объект в основном фекенции, потому что температура распределяется динамически, но Temp Pass копия этого объекта и его объем, потерянный после того, как эта функция заканчивается.
. /> Здесь является полным кодом для справки: < /p>
#include
#include
class Symbol{
public:
std::string name = "";
bool is_constant = false;
bool is_expression = false;
char op;
double value = 0.0;
Symbol* left = nullptr;
Symbol* right = nullptr;

Symbol() {is_expression = true;}
Symbol(std::string name) {this->name = name;}
Symbol(double value) {this->value = value; this->is_constant = true;}
~Symbol() {};

Symbol operator+(Symbol other){
if(this->is_constant & other.is_constant){
double value = this->value + other.value;
Symbol temp(value);
return temp;
}

Symbol temp;
temp.op = '+';
temp.left = this;
temp.right = &other;

return temp;
}

Symbol operator+(double other){
Symbol *temp = new Symbol(other);
if(this->is_constant){
double value = this->value + temp->value;
Symbol temp2(value);
return temp2;
}

Symbol temp2;
temp2.op = '+';
temp2.left = this;
temp2.right = temp;

return temp2;
// // uncomment below line and comment above function code and this will give segmentation fault
// return *this + *(new Symbol(other));
}

void print(){
if(this->is_expression){
std::cout left->print();
std::cout op right->print();
std::cout is_constant){
std::cout value

Подробнее здесь: https://stackoverflow.com/questions/794 ... uplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»