Добрый день. Нужна Ваша помощь в реализации одной программы. Вот суть задания:
Создать класс СТРОКА, реализующий текстовую строку. То есть хранит цепочку символов переменной длины, позволяет определить её длину, поддерживает операцию конкатенации и сравнения двух строк. Составить примеры использования и набор тестов.
Создать класс ШЕСТНАДЦАТЕРИЧНАЯ_СТРОКА. Строки данного класса могут содержать только символы '0', '1', '2', '3','4', '5','6', '7','8', '9','A, 'B','C', 'D', 'E', 'F'. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, ШЕСТНАДЦАТЕРИЧНАЯ_СТРОКА принимает нулевое значение. Добавить возможность заполнения значения строки из числа в восьмеричной системе.
Вот то, что я сделал. Буду благодарен, если поможете доделать/исправить программу. Буду рад всем замечаниям и объяснениям.
Мой код:
String.h
#pragma once
#include <iostream>
#include <cstring>
using namespace std;
class String
{
protected:
char* Str;
int Length;
public:
String();
String(const char* ptr);
String(const String& t);
String& operator = (String& t);
String& operator += (const String& t);
bool operator == (const String& t) const;
bool operator != (const String& t) const;
bool is_empty() const;
const char* getStr() const;
int getLength() const;
ostream & show(ostream & os) const;
friend ostream & operator << (ostream & os, const String & s)
{
return s.show(os);
}
~String();
};
String.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "String.h"
#include <iostream>
#include <cstring>
using namespace std;
String::String()
{
Str = 0;
Length = 0;
}
String::String(const char* ptr)
: Length(strlen(ptr)), Str(new char[Length + 1])
{
strcpy(Str, ptr);
}
String::String(const String& t)
: Length(strlen(t.Str)), Str(new char[Length + 1])
{
strcpy(Str, t.Str);
}
String& String::operator = (String& t)
{
swap(Length, t.Length);
swap(Str, t.Str);
return *this;
}
String& String::operator += (const String& t)
{
int newLength = Length + t.Length;
char *newStr = new char[newLength + 1];
strcpy(newStr, Str);
strcat(newStr, t.Str);
delete[] Str;
Str = newStr;
Length = newLength;
return *this;
}
bool String::operator == (const String& t) const
{
return Length == t.Length && strcmp(Str, t.Str) == 0;
}
bool String::operator != (const String& t) const
{
return !(operator == (t));
}
bool String::is_empty() const
{
return Str == 0 || Str[0] == '\0';
}
const char* String::getStr() const
{
return Str;
}
int String::getLength() const
{
return Length;
}
ostream & String::show(ostream & os) const
{
return os << "\"" << (Str ? Str : "") << "\"";
}
String::~String()
{
Length = 0;
delete[] Str;
Str = 0;
}
main.cpp
#include "String.h"
#include <iostream>
#include <conio.h>
#include <cstring>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
String s("0 1 2 3 4 5 6 7 8 9 A B C D E F");
String f("Qwertyy");
cout << s << endl;
cout << (s == f) << endl;
s += f;
cout << s << endl;
_getch();
return 0;
}