Changed from reference to pointer
authorAlma Dejus <almde515@student.liu.se>
Wed, 11 Oct 2023 15:06:24 +0000 (17:06 +0200)
committerAlma Dejus <almde515@student.liu.se>
Wed, 11 Oct 2023 15:06:24 +0000 (17:06 +0200)
src/expression.cc
src/operands.h
src/operators.cc
src/operators.h

index ff1a8f0c71c8a7fbf7fc5359b6479eee77ff99d7..92e3a2cb6fe168a35c2e250cccfc26d95187b36d 100644 (file)
@@ -22,7 +22,12 @@ Expression::Expression(const std::string & expression)
             new_node = new Const_double{std::stod(token)};
         }
         else if ( isalpha(token.at(0)))
-        {   
+        {
+            while(!stack.empty())
+            {
+                delete stack.top();
+                stack.pop();
+            }
             throw std::logic_error("Variables are not implemented");
         }
         else if (token.is_operator())
@@ -34,28 +39,33 @@ Expression::Expression(const std::string & expression)
 
             if (lhs == nullptr || rhs == nullptr) 
             {
+                while(!stack.empty())
+                {
+                    delete stack.top();
+                    stack.pop();
+                }
                 throw std::logic_error("Missing operands");
             }
             
             if (token == "+")
             {
-                new_node = new Addition{*lhs, *rhs};
+                new_node = new Addition{lhs, rhs};
             }
             else if (token == "-")
             {
-                new_node = new Subtraction{*lhs, *rhs};
+                new_node = new Subtraction{lhs, rhs};
             }
             else if (token == "/")
             {
-                new_node = new Division{*lhs, *rhs};        
+                new_node = new Division{lhs, rhs};        
             }
             else if (token == "*")
             {
-                new_node = new Multiplication{*lhs, *rhs};
+                new_node = new Multiplication{lhs, rhs};
             }
             else if (token == "^")
             {
-                new_node = new Exponent{*lhs, *rhs};
+                new_node = new Exponent{lhs, rhs};
             }
             else
             {
@@ -64,6 +74,11 @@ Expression::Expression(const std::string & expression)
         }
         else
         {
+            while(!stack.empty())
+            {
+                delete stack.top();
+                stack.pop();
+            }
             throw std::logic_error("Undefined characters in expression");
         }
         stack.push(new_node);
@@ -72,12 +87,18 @@ Expression::Expression(const std::string & expression)
     {
         throw std::logic_error("Empty expression");
     }
+
+    expression_root = stack.top();
+
     if (stack.size() > 1) 
     {
+        while(!stack.empty())
+        {
+            delete stack.top();
+            stack.pop();
+        }
         throw std::logic_error("Missing operators");
     }
-
-    expression_root = stack.top();
 }
 
 Expression::Expression(Expression && other)
@@ -124,6 +145,7 @@ Expression & Expression::operator=(Expression && other)
         return *this;
     }
 
+    delete expression_root;
     expression_root = other.expression_root;
     other.unlink();
     return *this;
index 04769fe2a0bd1e19e90cc0cf2db1c396c999214e..135a47f37081bd7b32b33f6f81ac4ddcb8c0e23f 100644 (file)
@@ -45,7 +45,6 @@ private:
     double value;
 };
 
-
 class Variable : public Operand
 {
 public:
@@ -60,7 +59,4 @@ private:
     double value;
 };
 
-
-
-
 #endif
\ No newline at end of file
index f81a23e75ab15a29f30b34d6bc908bd71ae5863e..cd16ad7ddb2e4e6b77d268a78146959620d833ee 100644 (file)
@@ -36,8 +36,8 @@ std::string Operator::get_prefix() const
     return concat.str();
 }
 
-Addition::Addition(Node & l, Node & r)
-: Operator{&l, &r, "+"}
+Addition::Addition(Node * l, Node * r)
+: Operator{l, r, "+"}
 {}
 
 double Addition::get_value() const
@@ -45,8 +45,8 @@ double Addition::get_value() const
     return lhs->get_value() + rhs->get_value();
 }
 
-Subtraction::Subtraction(Node & l, Node & r)
-: Operator{&l, &r, "-"}
+Subtraction::Subtraction(Node * l, Node * r)
+: Operator{l, r, "-"}
 {}
 
 double Subtraction::get_value() const
@@ -54,8 +54,8 @@ double Subtraction::get_value() const
     return lhs->get_value() - rhs->get_value();
 }
 
-Multiplication::Multiplication(Node & l, Node & r)
-: Operator{&l, &r, "*"}
+Multiplication::Multiplication(Node * l, Node * r)
+: Operator{l, r, "*"}
 {}
 
 double Multiplication::get_value() const
@@ -63,8 +63,8 @@ double Multiplication::get_value() const
     return lhs->get_value() * rhs->get_value();
 }
 
-Division::Division(Node & l, Node & r)
-: Operator{&l, &r, "/"}
+Division::Division(Node * l, Node * r)
+: Operator{l, r, "/"}
 {}
 
 double Division::get_value() const
@@ -75,13 +75,13 @@ double Division::get_value() const
     return lhs->get_value() / rhs->get_value();
 }
 
-Exponent::Exponent(Node & l, Node & r)
-: Operator{&l, &r, "^"}
+Exponent::Exponent(Node * l, Node * r)
+: Operator{l, r, "^"}
 {}
 
 double Exponent::get_value() const
 {
-    if (lhs->get_value() < 0.0 && std::fmod(rhs->get_value(), 1) == 0.0)
+    if (lhs->get_value() < 0.0 && std::fmod(rhs->get_value(), 1) != 0.0)
     {
         throw std::logic_error("Cannot have negative base with decimal exponent");
     }
index d067fe9605f711c1eb4651ad6e28edb7b29ea4c4..bfe5bb655501b4b1b5d041f60f178a9ef9c718ac 100644 (file)
@@ -15,8 +15,9 @@ public:
 
     Operator(Operator const &) = delete;
     Operator & operator=(Operator const &) = delete;
-
+    
     ~Operator();
+
     std::string get_symbol() const;
     std::string get_postfix() const override;
     std::string get_infix() const override;
@@ -32,8 +33,7 @@ private:
 class Addition : public Operator
 {
 public:
-    Addition(Node & l, Node & r);
-
+    Addition(Node * l, Node * r);
     double get_value() const override;
 protected:
 private:
@@ -42,8 +42,7 @@ private:
 class Subtraction : public Operator
 {
 public:
-    Subtraction(Node & l, Node & r);
-
+    Subtraction(Node * l, Node * r);
     double get_value() const override;
 protected:
 private:
@@ -52,8 +51,7 @@ private:
 class Multiplication : public Operator
 {
 public:
-    Multiplication(Node & l, Node & r);
-
+    Multiplication(Node * l, Node * r);
     double get_value() const override;
 protected:
 private:
@@ -62,8 +60,7 @@ private:
 class Division : public Operator
 {
 public:
-    Division(Node & l, Node & r);
-
+    Division(Node * l, Node * r);
     double get_value() const override;
 protected:
 private:
@@ -72,7 +69,7 @@ private:
 class Exponent : public Operator
 {
 public:
-    Exponent(Node & l, Node & r);
+    Exponent(Node * l, Node * r);
 
     double get_value() const override;
 protected: