String类封装

来源:互联网 发布:农村淘宝佣金在哪看 编辑:程序博客网 时间:2024/05/27 03:29
//Node.htypedef int Node_entry;typedef int Node_entry;enum Error_code {success, overflow, underflow, rangeError};template <class Node_entry>struct Node {    Node_entry entry;    Node<Node_entry> *next;    Node();    Node(Node_entry item, Node<Node_entry> *link = NULL);};template <class Node_entry>Node<Node_entry>::Node(){    next = NULL;}template <class Node_entry>Node<Node_entry>::Node(Node_entry item, Node<Node_entry> *link){    entry = item;    next = link;}//List.h#include "Node.h"template<class List_entry>class List {public:    List();    ~List();    bool empty() const;    List(const List<List_entry> ©);    List<List_entry> operator = (const List<List_entry> ©);    Error_code insert(int position, const List_entry &x);    Error_code retrieve(int position, List_entry &x);    Error_code replace(int position, const List_entry &x);    Error_code remove(int position);    int size() const;    void clear();protected:    int count;    Node<List_entry> *head;    Node<List_entry> *set_position(int position) const;};template<class List_entry>Error_code List<List_entry>::remove(int position){    if (count == 0) return underflow;    if (position < 0 || position >= count) return rangeError;    Node<List_entry> *t, *target = set_position(position - 1);    t = target->next;    target->next = target->next->next;    delete t;    return success;}template<class List_entry>Error_code List<List_entry>::replace(int position, const List_entry &x){   if (position < 0 || position > count) return rangeError;    Node<List_entry> *target = set_position(position);    target->entry = x;    return success;}template<class List_entry>int List<List_entry>::size() const{    return count;}template<class List_entry>List<List_entry> List<List_entry>::operator = (const List<List_entry> ©){    List<List_entry> new_list(copy);    clear();    head = new_list.head;    count = new_list.count;    new_list.count = 0;    new_list.head = NULL;    return *this;}template<class List_entry>void List<List_entry>::clear(){       Node<List_entry> *t = head;    while (!empty()) {    head = t->next;    delete t;    t = head;    }}template<class List_entry>bool List<List_entry>::empty() const{    return head == NULL;}template<class List_entry>List<List_entry>::~List(){    clear();}template<class List_entry>Error_code List<List_entry>::retrieve(int position, List_entry &x){    if (position < 0 || position > count)        return underflow;    Node<List_entry> *t = set_position(position);        x = t->entry;    return success;}    template<class List_entry>List<List_entry>::List(const List<List_entry> ©){    Node<List_entry> *new_node, *copy_copy = copy.head;    if (copy.head == NULL)           head = NULL;    else {           head = new_node = new Node<List_entry>(copy.head->entry);           while (copy_copy->next != NULL) {               copy_copy = copy_copy->next;               new_node->next = new Node<List_entry>(copy_copy->entry);               new_node = new_node->next;           }    }    count = copy.count;}template<class List_entry>List<List_entry>::List(){   head = NULL;    count = 0; }template<class List_entry>Node<List_entry> *List<List_entry>::set_position(int position) const{    Node<List_entry> *q = head;    for (int i = 0; i < position; i++)        q = q->next;    return q;}template<class List_entry>Error_code List<List_entry>::insert(int position, const List_entry &x){    if (position < 0 || position > count)        return rangeError;    Node<List_entry> *new_node, *previous, *following;    if (position > 0) {        previous = set_position(position - 1);        following = previous->next;    }    else following = head;    new_node = new Node<List_entry>(x, following);    if (new_node == 0)        return overflow;    if (position == 0)        head = new_node;    else        previous->next = new_node;    count++;    return success;}//String.h#include <cstring>#include <iostream>#include "List.h"class String {public:    String();    ~String();    String(const String ©);    String(const char *copy);    String(List<char> ©);    String& operator = (const String ©);    const char *c_str() const;    void test();protected:    char *entries;    int length;};bool operator == (const String &first, const String &second);bool operator > (const String &first, const String &second);bool operator < (const String &first, const String &second);bool operator >= (const String &first, const String &second);bool operator <= (const String &first, const String &second);bool operator != (const String &first, const String &second);bool operator == (const String &first, const String &second){    return strcmp(first.c_str(), second.c_str()) == 0;}bool operator > (const String &first, const String &second){    return strcmp(first.c_str(), second.c_str()) > 0;}bool operator < (const String &first, const String &second){    return strcmp(first.c_str(), second.c_str()) < 0;}bool operator >= (const String &first, const String &second){    return strcmp(first.c_str(), second.c_str()) >= 0;}bool operator <= (const String &first, const String &second){    return strcmp(first.c_str(), second.c_str()) <= 0;}bool operator != (const String &first, const String &second){    return strcmp(first.c_str(), second.c_str()) != 0;}const char* String::c_str() const{    return (const char *)entries;}String& String::operator = (const String ©){    delete [] entries;    length = copy.length;    entries = new char[length + 1];    strcpy(entries, copy.entries);    return *this;}    void String::test(){    std::cout << entries ;}String::String(const char *in_string){    length = strlen(in_string);    entries = new char[length + 1];    strcpy(entries, in_string);}String::String(List<char> &in_list){    length = in_list.size();    entries = new char[length + 1];    for (int i = 0; i < length; i++)     in_list.retrieve(i, entries[i]);    entries[length] = '\0';}String::String(){    length = 0;    entries = new char[1];    strcpy(entries, "");}String::~String(){    delete [] entries;}String::String(const String ©){    length = copy.length;    entries = new char[length + 1];    for (int i = 0; i < length; i++)         entries[i] = copy.entries[i];    entries[length] = '\0';}//trial.cpp#include <iostream>#include "String.h"using namespace std;class String;void main(){    String a("ttt");    String b;    String c;    b = c = a;    a.test();    cout << endl;    b.test();    cout << endl;    c.test();    cout << c.c_str() << endl;    bool x = (a != b);    cout << x;    system("pause");    return;}   

原创粉丝点击