SharedSchoolSpace/作业/数据结构-金健/C++/第三章作业/include/model.hpp

156 lines
3.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// @Time : 2023-10-23 20:09:23
// @FileName: model.h
// @Author : 423A35C7
// @Software: VSCode
#ifndef _MODEL
#define _MODEL
#include "constants.h"
#include <bits/stdc++.h>
// using namespace std; // 会导致byte冲突
class Model {
// virtual void init(...) = 0;
};
template <class T, class Ref, class Ptr>
struct __SingleQueueModel_iterator;
template <typename T>
class SingleQueueModel : Model {
public: // 这里用保护属性会在view的resfresh里报错
class Node;
private:
// unique_ptr<Node> head(new Node()); // 这样会报错error: expected identifier before 'new'
// vector内对一个对象可能有多个引用所以可能使用了unique_ptr就无法放置在vector里
std::shared_ptr<Node> head = std::make_shared<Node>(); // 好像用unique_ptr直接初始化会报错
Node *tail = head.get();
typedef __SingleQueueModel_iterator<T, const T &, const T *> 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 <class T, class Ref, class Ptr>
struct __SingleQueueModel_iterator {
typedef class SingleQueueModel<T>::Node Node;
typedef __SingleQueueModel_iterator<T, Ref, Ptr> 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 <typename T>
// class SimpleQueueModel : public SingleQueueModel<T> {
// class Node; // 这一行必须得加上表示子类需要重写父类的成员否则在外部定义时会报错invalid class name in declaration of 'class SimpleQueueModel<T>::Node'
// };
template <typename T>
class SingleQueueModel<T>::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 <typename T>
class ComplexSingleQueueModel : SingleQueueModel<T> {
public:
Status push(T) = 0;
Status pop(T &) = 0;
Status shift(T &) = 0;
};
template <typename SingleQueueModel>
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