Задать вопрос
@EgaNator
Учусь на программиста

Реализация класса «Строка», помощь в написании программы, правильно ли я делаю?

Добрый день. Нужна Ваша помощь в реализации одной программы. Вот суть задания:
Создать класс СТРОКА, реализующий текстовую строку. То есть хранит цепочку символов переменной длины, позволяет определить её длину, поддерживает операцию конкатенации и сравнения двух строк. Составить примеры использования и набор тестов.
Создать класс ШЕСТНАДЦАТЕРИЧНАЯ_СТРОКА. Строки данного класса могут содержать только символы '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;
}
  • Вопрос задан
  • 7795 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
Не...
порядок инициализации в конструкторе
protected:
  char* Str;  // first
  int Length; // second


Тогда или так
String::String(const char* ptr)
  : Str(new char[strlen(ptr) + 1]), Length(strlen(ptr) + 1)
{
  strcpy(Str, ptr);
}

String::String(const String& t)
  : Str(new char[t.Length]), Length(t.Length)
{
  strcpy(Str, t.Str);
}

Или поменять местами члены.
protected:
  int Length;  // first
  char* Str;   // second

лучше конечно ориентироваться/подглядеть на/в STL
https://ru.cppreference.com/w/cpp/string/char_traits
https://ru.cppreference.com/w/cpp/string/basic_string

hex_string
только символы '0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'A, 'B', 'C', 'D', 'E', 'F'.

//...
struct hex_str_traits
{
  static bool is_hex_chars(const char* s)
  {
    auto size{ strlen(s) };
    for (auto idx{ 0 }; idx < size; ++idx)
    {
      if (!in_range(s[idx], '0', '9') && !in_range(s[idx], 'A', 'F'))
        return false;
    }
    return true;
  }
  static bool in_range(const int& value, const int& a, const int& b)
  {
    return a <= value && value <= b;
  }
};
//...

class hex_string : public String
{
//...
public:
  hex_string(const char* s);
//...
};
//...
hex_string::hex_string(const char* s) 
  : String( (hex_str_traits::is_hex_chars(s) ? s : "") )
{
}
//...

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш оператор = очень жестоко обходится с правой частью. Написав a=b; я бы очень удивился, обнаружив в b содержимое a.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы