Added destructors and memory management
authorNilsForssen <forssennils@gmail.com>
Mon, 9 Oct 2023 11:07:40 +0000 (13:07 +0200)
committerNilsForssen <forssennils@gmail.com>
Mon, 9 Oct 2023 11:07:40 +0000 (13:07 +0200)
src/expression.cc
src/expression.h
src/operators.cc
src/operators.h
src/uppgift13.cc

index ed2cd5fe942344d2bad6fff4dca51674f47fff50..ff1a8f0c71c8a7fbf7fc5359b6479eee77ff99d7 100644 (file)
@@ -36,7 +36,7 @@ Expression::Expression(const std::string & expression)
             {
                 throw std::logic_error("Missing operands");
             }
-
+            
             if (token == "+")
             {
                 new_node = new Addition{*lhs, *rhs};
@@ -80,6 +80,17 @@ Expression::Expression(const std::string & expression)
     expression_root = stack.top();
 }
 
+Expression::Expression(Expression && other)
+: expression_root{nullptr}
+{
+    *this = std::move(other);
+}
+
+Expression::~Expression()
+{
+    delete expression_root;
+}
+
 std::string Expression::to_infix_string() const
 {
     return expression_root->get_infix();
@@ -98,4 +109,22 @@ std::string Expression::to_prefix_string() const
 double Expression::evaluate() const
 {
     return expression_root->get_value();
+}
+
+void Expression::unlink()
+{
+    expression_root = nullptr;
+}
+
+Expression & Expression::operator=(Expression && other)
+{
+    if (this == &other) 
+    {
+        // Do nothing, return
+        return *this;
+    }
+
+    expression_root = other.expression_root;
+    other.unlink();
+    return *this;
 }
\ No newline at end of file
index 7ae5a9735bddf8506ee778478ffbd13aad7b6ee4..4505b7a0a2e7a9a1d650757b5e1c2698e41f1bdd 100644 (file)
@@ -3,21 +3,21 @@
 
 #include <string>
 #include <sstream>
+#include <cctype>   //Behövs?
+#include <algorithm>    //Behövs?
+#include <stdexcept>
 
 #include "postfix.h"
 #include "token.h"
 #include "operators.h"
 #include "operands.h"
 
-#include <iostream> // TA bort
-#include <cctype>
-#include <algorithm>
-#include <stdexcept>
-
 class Expression
 {
 public:
     Expression(const std::string & expression);
+    Expression(Expression && other);    // Move constructor
+    ~Expression();
 
     Expression(Expression const&) = delete;
     Expression& operator=(Expression const&) = delete;
@@ -25,16 +25,16 @@ public:
     std::string to_infix_string() const;
     std::string to_postfix_string() const;
     std::string to_prefix_string() const;
-    
+
+    Expression & operator=(Expression && other);    // Move operator
+
     double evaluate() const;
 
+    void unlink();
+
 protected:
 private:
     Node *expression_root;
 };
 
-class Result
-{
-};
-
 #endif
\ No newline at end of file
index 5cdf094022c509d99c745170dd7294795acbc0e7..f81a23e75ab15a29f30b34d6bc908bd71ae5863e 100644 (file)
@@ -4,6 +4,12 @@ Operator::Operator(Node * l, Node * r, std::string sym)
 : rhs{r}, lhs{l}, symbol{sym}
 {}
 
+Operator::~Operator()
+{
+    delete rhs;
+    delete lhs;
+}
+
 std::string Operator::get_symbol() const
 {
     return symbol;
index 5023a397e4cd8608aa7c734aa5be195de4ae3773..d067fe9605f711c1eb4651ad6e28edb7b29ea4c4 100644 (file)
@@ -16,8 +16,7 @@ public:
     Operator(Operator const &) = delete;
     Operator & operator=(Operator const &) = delete;
 
-    virtual ~Operator() = default;
-
+    ~Operator();
     std::string get_symbol() const;
     std::string get_postfix() const override;
     std::string get_infix() const override;
index d5252f521dd6987d4003551953d55472494a7ea8..129080d8e49c6ed42b32b06fc72d4511dfc0b7a3 100644 (file)
@@ -44,7 +44,7 @@ int main()
     }
     else 
     {
-      Expression e{line};
+      e = line;
     }
   }
   return 0;