Перегрузка строкового класса С++

Условие задачи *Создать класс для работы со строчками. Максимальная длина последовательности – 254. Первый байт должен содержать информацию о фактическом количестве элементов массива. Совершить перегрузку операций:

  • "=" – присвоение,

  • "+" – конкатенация (соединение) строк,

  • "<=" – отношение "меньше или равно",

  • " >= " – отношение "больше или равно",

  • "==" – отношение "равно",

  • "!=" – отношение "не равно".

В классе предусмотреть конструктор инициализации, конструктор копирования, деструктор.*

Вот мой код Файл main.cpp

#include <iostream>
#include <string.h>
#include "line.h"


using namespace std;

int main(){
    setlocale(LC_ALL , "Rus");
    String input1,input2;
    int change;
    cout << "Введите первую строку: ";
    cin >> input1;
    cout << "Введите вторую строку: ";
    cin >> input2;
    cout << "\t\tДействия" << endl;
    cout << "1.Присваивание строк;" << endl;
    cout << "2.Конкатенация строк;" << endl;
    cout << "3.Отношение(больше или равно);" << endl;
    cout << "4.Отношение(меньше или равно);" << endl;
    cout << "5.Отношение(равно);" << endl;
    cout << "6.Отношение(не равно)." << endl;
    cout << "Выбор: ";
    cin >> change;  
    switch(change){
        case 1:{
            input2 = input1;
            cout << "Результат: " << input2 << endl;;
            break;
        }
        case 2:{
            String result = input1 + input2;
            cout << "Результат конкатенации: " << result << endl;
            break;
        }
        case 3:{                  
            bool result = input1 >= input2;
            if(result == true){
                cout << "Первая строка больше либо равно второй" << endl;
            }
            else{
                cout << "Первая строка меньше второй" << endl;
            }
            break;  
        }
        case 4:{
            bool result = input1 <= input2;
            if(result == true){
                cout << "Первая строка меньше либо равно второй" << endl;
            }
            else{
                cout << "Первая строка больше второй" << endl;
            }
            break;  
        }
        case 5:{
            if((input1 == input2)){
                cout << "Равны"    << endl;
            }
            else{
                cout << "Не равны" << endl; 
            }                  
            break;
        }
        case 6:{
            bool result = input1 != input2;
            if(result == true){
                cout << "Первая строка не равна второй" << endl;
            }
            else{
                cout << "Первая строка равна второй" << endl;
            }
            break;
        }
    
        default:{
            cout << "Ошибка..." << endl;
            return 1;
            break;
        }
    } 
    return 0;
}

Файл line.h(Строковый класс)

#include <iostream>

using namespace std;

class String{ 
public:
char *str;

String();
~String();

String(const String &other);

String operator = (String &line);
String operator + (String &line);
bool operator <= (String &line);
bool operator >= (String &line);
bool operator == (String &line);
bool operator != (String &line);

friend  ostream &operator<<(ostream &stream, String& obj);
friend  istream &operator>>(istream &stream, String& obj);

void strcopy(char *str1,char *str2);
char mystrcat(char *str1,const char *str2);
int strlenght(const char *str);

};

String::String(){
    str = new char[256];
}

String::~String(){
    delete[] str;
}

String::String(const String &other){
    str = new char[256];
    strcopy(str,other.str);
}  

String String::operator = (String &line){
    strcopy(str,line.str);
    return *this;
}

String String::operator + (String &line){
    mystrcat(str,line.str);
    return *this;
}

bool String::operator >= (String &line){
    if(strlenght(str) >= strlenght(line.str)){
        return true;
    }
    else{
        return false;
    }
}

bool String::operator <= (String &line){
    if(strlenght(str) <= strlenght(line.str)){
        return true;
    }
    else{
        return false;
   }
}

bool String::operator != (String &line){
    if(strlenght(str) != strlenght(line.str)){
        return true;
    }   
    else{
        return false;
    }
}  

bool String::operator == (String &line){
    return strlenght(str) == strlenght(line.str);
}


ostream &operator<<(ostream &stream, String &obj){
    stream<<obj.str;
    return stream;
}

istream &operator>>(istream &stream, String &obj){
    stream>>obj.str;
    return stream;
}


void String::strcopy(char *str1,char *str2){
    while(*str1++ = *str2++);   
}

char String::mystrcat(char *str1,const char *str2){
    char *begin = str1;

    while(*str1){
        str1++;
    }
    while(*str1++ = *str2++);


    *str1 = '\0';
    return *begin;
}


int String::strlenght(const char *str){
    int counter = 0;
    while(*str != '\0'){
        counter++;
        str++;
    }

    return counter;
}

Собственно в чем проблема,вот с этой частью условия : **Максимальная длина последовательности – 254. Первый байт должен содержать информацию о фактическом количестве элементов массива.**Не знаю как это реализовать подскажите пожалуйста


Ответы (1 шт):

Автор решения: Harry

Что-то типа

class pstring
{
    char s[256] = {};
public:
    pstring(const char * s = "");
    pstring(const pstring& s) = default;
    pstring& operator=(const pstring& s) = default;
    ~pstring() = default;

    operator const char *() const { return s+1; }
    size_t length() const { return (unsigned char)s[0]; }

    friend pstring operator+(const pstring& a, const pstring& b);


};

pstring::pstring(const char * p)
{
    for(size_t i = 0; i <= 254 && *p; ++i)
        s[(unsigned char)(s[0] = char(i+1))] = *p++;
}

pstring operator+(const pstring& a, const pstring& b)
{
    pstring r(a);
    if (a.length() < 254)
    {
        for(size_t i = a.length()+1, j = 0; i < 255 && j < b.length();
            ++i, ++j)
        {
            r.s[i] = b[j];
            r.s[0] = char(i);
        }
    }
    return r;
}


int main(int argc, char * argv[])
{
    pstring a = "Hello", b = "Dolly";

    cout << a + ", " + b << endl;
    cout << (a + ", " + b).length() << endl;
}

Дальше сами справитесь?

→ Ссылка