{"pageProps":{"code":{"CMakeLists.txt":{"name":"CMakeLists.txt","content":"add_executable(overload-arrow overload-arrow.cpp)\n\nadd_executable(overload-inc-dec overload-inc-dec.cpp)\n\nadd_executable(overload-io overload-io.cpp)\n\nadd_executable(overload-relational-equality overload-relational-equality.cpp)\n\nadd_executable(overload-type overload-type.cpp)\n\nadd_executable(point1 point1.cpp)\n\nadd_executable(point2 point2.cpp)\n","path":"code/6771/25T2/4.1/CMakeLists.txt","fileext":"txt"},"overload-arrow.cpp":{"name":"overload-arrow.cpp","content":"#include <iostream>\nclass stringptr {\npublic:\n    explicit stringptr(std::string const& s)\n        : ptr_ { new std::string(s) }\n    {\n    }\n    ~stringptr()\n    {\n        delete ptr_;\n    }\n    std::string* operator->() const\n    {\n        return ptr_;\n    }\n    std::string& operator*() const\n    {\n        return *ptr_;\n    }\n\nprivate:\n    std::string* ptr_;\n};\n\nauto main() -> int\n{\n    auto p = stringptr(\"smart pointer\");\n    std::cout << *p << '\\n';\n    std::cout << p->size() << '\\n';\n}","path":"code/6771/25T2/4.1/overload-arrow.cpp","fileext":"cpp"},"overload-assignment.cpp":{"name":"overload-assignment.cpp","content":"#include <istream>\n\nclass point {\npublic:\n    point(int x, int y)\n        : x_ { x }\n        , y_ { y } {};\n    point& operator=(point const& p);\n\nprivate:\n    int x_;\n    int y_;\n};\n\npoint& point::operator=(point const& p)\n{\n    x_ = p.x_;\n    y_ = p.y_;\n    return *this;\n}\n","path":"code/6771/25T2/4.1/overload-assignment.cpp","fileext":"cpp"},"overload-compound-assign.cpp":{"name":"overload-compound-assign.cpp","content":"class point {\npublic:\n    point(int x, int y)\n        : x_ { x }\n        , y_ { y } {};\n    point& operator+=(point const& p);\n    point& operator-=(point const& p);\n    point& operator*=(point const& p);\n    point& operator/=(point const& p);\n    point& operator*=(int i);\n\nprivate:\n    int x_;\n    int y_;\n};\n\npoint& point::operator+=(point const& p)\n{\n    x_ += p.x_;\n    y_ += p.y_;\n    return *this;\n}\n\npoint& operator+=(point const& p) { /* what do we put here? */ }\npoint& operator-=(point const& p) { /* what do we put here? */ }\npoint& operator*=(point const& p) { /* what do we put here? */ }\npoint& operator/=(point const& p) { /* what do we put here? */ }\npoint& operator*=(int i) { /* what do we put here? */ }","path":"code/6771/25T2/4.1/overload-compound-assign.cpp","fileext":"cpp"},"overload-inc-dec.cpp":{"name":"overload-inc-dec.cpp","content":"// RoadPosition.h:\nclass RoadPosition {\npublic:\n    RoadPosition(int km)\n        : km_from_sydney_(km)\n    {\n    }\n    RoadPosition& operator++(); // prefix\n    // This is *always* an int, no\n    // matter your type.\n    RoadPosition operator++(int); // postfix\n    void tick();\n    int km() { return km_from_sydney_; }\n\nprivate:\n    void tick_();\n    int km_from_sydney_;\n};\n\n// RoadPosition.cpp:\n#include <iostream>\nRoadPosition& RoadPosition::operator++()\n{\n    this->tick_();\n    return *this;\n}\nRoadPosition RoadPosition::operator++(int)\n{\n    RoadPosition rp = *this;\n    this->tick_();\n    return rp;\n}\nvoid RoadPosition::tick_()\n{\n    ++(this->km_from_sydney_);\n}\n\nauto main() -> int\n{\n    auto rp = RoadPosition(5);\n    std::cout << rp.km() << '\\n';\n    auto val1 = (rp++).km();\n    auto val2 = (++rp).km();\n    std::cout << val1 << '\\n';\n    std::cout << val2 << '\\n';\n}","path":"code/6771/25T2/4.1/overload-inc-dec.cpp","fileext":"cpp"},"overload-io.cpp":{"name":"overload-io.cpp","content":"#include <iostream>\n#include <istream>\n#include <ostream>\n\nclass point {\npublic:\n    point(int x, int y)\n        : x_ { x }\n        , y_ { y } {};\n    friend std::ostream& operator<<(std::ostream& os, const point& type);\n    friend std::istream& operator>>(std::istream& is, point& type);\n\nprivate:\n    int x_;\n    int y_;\n};\n\nstd::ostream& operator<<(std::ostream& os, point const& p)\n{\n    os << \"(\" << p.x_ << \",\" << p.y_ << \")\";\n    return os;\n}\n\n/*std::istream& operator>>(std::istream& is, point& p) {\n        // To be done in tutorials\n}*/\n\nauto main() -> int\n{\n    point p(1, 2);\n    std::cout << p << '\\n';\n}","path":"code/6771/25T2/4.1/overload-io.cpp","fileext":"cpp"},"overload-relational-equality.cpp":{"name":"overload-relational-equality.cpp","content":"#include <iostream>\n\nclass point {\npublic:\n    point(int x, int y)\n        : x_ { x }\n        , y_ { y }\n    {\n    }\n    // hidden friend - preferred\n    friend bool operator==(point const& p1, point const& p2)\n    {\n        return p1.x_ == p2.x_ and p1.y_ == p2.y_;\n        // return std::tie(p1.x_, p1.y_) == std::tie(p2.x_, p2.y_);\n    }\n    friend bool operator!=(point const& p1, point const& p2)\n    {\n        return not(p1 == p2);\n    }\n    friend bool operator<(point const& p1, point const& p2)\n    {\n        return p1.x_ < p2.x_ and p1.y_ < p2.y_;\n    }\n    friend bool operator>(point const& p1, point const& p2)\n    {\n        return p2 < p1;\n    }\n    friend bool operator<=(point const& p1, point const& p2)\n    {\n        return not(p2 < p1);\n    }\n    friend bool operator>=(point const& p1, point const& p2)\n    {\n        return not(p1 < p2);\n    }\n\nprivate:\n    int x_;\n    int y_;\n};\n\nauto main() -> int\n{\n    auto const p2 = point { 1, 2 };\n    auto const p1 = point { 1, 2 };\n    std::cout << \"p1 == p2 \" << (p1 == p2) << '\\n';\n    std::cout << \"p1 != p2 \" << (p1 != p2) << '\\n';\n    std::cout << \"p1 < p2 \" << (p1 < p2) << '\\n';\n    std::cout << \"p1 > p2 \" << (p1 > p2) << '\\n';\n    std::cout << \"p1 <= p2 \" << (p1 <= p2) << '\\n';\n    std::cout << \"p1 >= p2 \" << (p1 >= p2) << '\\n';\n}","path":"code/6771/25T2/4.1/overload-relational-equality.cpp","fileext":"cpp"},"overload-subscript.cpp":{"name":"overload-subscript.cpp","content":"#include <cassert>\n\nclass point {\npublic:\n    point(int x, int y)\n        : x_ { x }\n        , y_ { y } {};\n    int& operator[](int i)\n    {\n        assert(i == 0 or i == 1);\n        return i == 0 ? x_ : y_;\n    }\n    int operator[](int i) const\n    {\n        assert(i == 0 or i == 1);\n        return i == 0 ? x_ : y_;\n    }\n\nprivate:\n    int x_;\n    int y_;\n};","path":"code/6771/25T2/4.1/overload-subscript.cpp","fileext":"cpp"},"overload-type.cpp":{"name":"overload-type.cpp","content":"#include <iostream>\n#include <vector>\n\nclass point {\npublic:\n    point(int x, int y)\n        : x_(x)\n        , y_(y)\n    {\n    }\n    explicit operator std::vector<int>()\n    {\n        std::vector<int> vec;\n        vec.push_back(x_);\n        vec.push_back(y_);\n        return vec;\n    }\n\nprivate:\n    int x_;\n    int y_;\n};\n\nint main()\n{\n    auto p = point(1, 2);\n    auto vec = static_cast<std::vector<int>>(p);\n    std::cout << vec[0] << '\\n';\n    std::cout << vec[1] << '\\n';\n}","path":"code/6771/25T2/4.1/overload-type.cpp","fileext":"cpp"},"point1.cpp":{"name":"point1.cpp","content":"#include <iostream>\r\n\r\nclass point {\r\npublic:\r\n    point(int x, int y)\r\n        : x_ { x }\r\n        , y_ { y } {};\r\n    [[nodiscard]] int x() const\r\n    {\r\n        return this->x_;\r\n    }\r\n    [[nodiscard]] int y() const\r\n    {\r\n        return this->y_;\r\n    }\r\n    static point add(point const& p1, point const& p2);\r\n\r\nprivate:\r\n    int x_;\r\n    int y_;\r\n};\r\n\r\nvoid print(std::ostream& os, point const& p)\r\n{\r\n    os << \"(\" << p.x() << \",\" << p.y() << \")\";\r\n}\r\n\r\npoint point::add(point const& p1, point const& p2)\r\n{\r\n    return point { p1.x() + p2.x(), p1.y() + p2.y() };\r\n}\r\n\r\nauto main() -> int\r\n{\r\n    point p1 { 1, 2 };\r\n    point p2 { 2, 3 };\r\n    print(std::cout, point::add(p1, p2));\r\n    std::cout << \"\\n\";\r\n}","path":"code/6771/25T2/4.1/point1.cpp","fileext":"cpp"},"point2.cpp":{"name":"point2.cpp","content":"#include <iostream>\r\n\r\nclass point {\r\npublic:\r\n    point(int x, int y)\r\n        : x_ { x }\r\n        , y_ { y } {};\r\n    friend point operator+(point const& lhs,\r\n        point const& rhs);\r\n    friend std::ostream& operator<<(std::ostream& os,\r\n        point const& p);\r\n\r\nprivate:\r\n    int x_;\r\n    int y_;\r\n};\r\n\r\npoint operator+(point const& lhs, point const& rhs)\r\n{\r\n    return point(lhs.x_ + rhs.x_, lhs.y_ + rhs.y_);\r\n}\r\n\r\nstd::ostream& operator<<(std::ostream& os, point const& p)\r\n{\r\n    os << \"(\" << p.x_ << \",\" << p.y_ << \")\";\r\n    return os;\r\n}\r\n\r\nauto main() -> int\r\n{\r\n    point p1 { 1, 2 };\r\n    point p2 { 2, 3 };\r\n    std::cout << p1 + p2 << \"\\n\";\r\n}","path":"code/6771/25T2/4.1/point2.cpp","fileext":"cpp"}}},"__N_SSG":true}