// @Time : 2023-10-23 20:09:23 // @FileName: model.h // @Author : 423A35C7 // @Software: VSCode #ifndef _MODEL #define _MODEL #include "constants.h" #include // using namespace std; // 会导致byte冲突 class Model { // virtual void init(...) = 0; }; template struct __SingleQueueModel_iterator; template class SingleQueueModel : Model { public: // 这里用保护属性会在view的resfresh里报错 class Node; private: // unique_ptr head(new Node()); // 这样会报错error: expected identifier before 'new' // vector内对一个对象可能有多个引用,所以可能使用了unique_ptr就无法放置在vector里 std::shared_ptr head = std::make_shared(); // 好像用unique_ptr直接初始化会报错 Node *tail = head.get(); typedef __SingleQueueModel_iterator const_iterator; protected: int_ length = 0; public: void init(){}; void push(const T &data) { this->tail->next = new Node(data); // head指向的头结点无值 this->tail = this->tail->next; // tail指向的始终有值 this->length ++; } // Status pop(T&) = 0; T shift() { if (this->head->next == this->tail) { this->tail = this->head.get(); // 只剩下一个元素的情况下删除后尾指针应指向头结点 } Node node = *this->head->next; // 这个临时的结点在退出此函数时也会调用析构函数 delete this->head->next; // 这里会调用析构函数 this->head->next = node.next; this->length --; return node.data; } T &top() { return this->head->next->data; } int_ get_length() { return this->length; } // https://blog.csdn.net/qq_54851255/article/details/123939684 const_iterator begin() const { return const_iterator(this->head->next); } const_iterator end() const { return const_iterator(this->tail->next); } }; template struct __SingleQueueModel_iterator { typedef class SingleQueueModel::Node Node; typedef __SingleQueueModel_iterator self; Node *_node; __SingleQueueModel_iterator(Node *x) : _node(x) {} Ref operator*() { return _node->data; } Ptr operator->() { return &_node->data; } self &operator++() { _node = _node->next; return *this; } self operator++(int) { self tmp(*this); _node = _node->next; return tmp; } bool operator!=(const self& it) const { return _node != it._node; } }; // template // class SimpleQueueModel : public SingleQueueModel { // class Node; // 这一行必须得加上,表示子类需要重写父类的成员,否则在外部定义时会报错invalid class name in declaration of 'class SimpleQueueModel::Node' // }; template class SingleQueueModel::Node { public: T data; Node *next = NULL; Node() {} // Node(Node *) {} Node(const T &data) { this->data = data; } #if _DEBUG ~Node() { TRACE_CMH_1; std::cout << "Node " << data << " at " << this << " destructed" << std::endl; } #endif }; template class ComplexSingleQueueModel : SingleQueueModel { public: Status push(T) = 0; Status pop(T &) = 0; Status shift(T &) = 0; }; template class MultiQueueModel : Model { public: Status init(int_ queue_num) = 0; Status get(int_ index, SingleQueueModel &) = 0; Status move(int_ start, int_ destination) = 0; }; struct Customer { int_ number; long cash; }; std::ostream &operator<<(std::ostream &out, const Customer &customer) { out << customer.number << " " << customer.cash; return out; }; #endif