Перегрузка строкового класса С++
Условие задачи *Создать класс для работы со строчками. Максимальная длина последовательности – 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 шт):
Что-то типа
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;
}
Дальше сами справитесь?