Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Arkanar
#1

Создать класс MyString - C++

03.06.2013, 16:51. Просмотров 1660. Ответов 4
Метки нет (Все метки)

Создать класс MyString, содержащий элемент данных указатель на массив типа char - текстовую строку. Конструктор класса с параметром (максимальной длиной строки) должен выделять память под размещение строки заданной длины. Переопределить для класса операцию + как конкатенации (склейки) двух строк. Создайте ,пожалуйста, если не сложно, также тестирующую оболочку, позволяющую продемонстрировать работу класса.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2013, 16:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать класс MyString (C++):

Создать класс MyString - C++
Ребята спайсайте Сессия до экзамена осталось 12 часов!!! Отблагодарю материально если все правильно решите, в долгу не останусь! Сразу...

Класс MyString через статические члены класса - C++
Всем доброго времени суток. Возникла необходимость решить задачу, хочу обратиться к знающим людям за подходящим к данной задаче...

Создать класс Man (человек), с полями: имя, возраст, пол и вес. Создать производный класс Student ... - C++
Создать класс Man (человек), с полями: имя, возраст, пол и вес. Определить методы задания имени, возраста и веса. Создать производный класс...

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями - C++
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Создать класс - данные - абстрактный базовый класс. Создать производные классы - C++
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

MyString в vector - C++
Приветствую, Столкнулся со следующей проблемой. Написал свой класс MyString. Далее создаю vector с типом MyString. Делаю это...

4
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
03.06.2013, 16:55 #2
MyString.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef _MYSTRING_H_
#define _MYSTRING_H_
#include <string>
#include <iostream>
using namespace std;
 
class MyString
{
    private:
        char *str;    //строка
    public:
        MyString(char * _str);   //конструктор с параметром в виде строковой константы
        MyString();              //конструктор по-умолчанию
        MyString(MyString& s);   //конструктор копирования
        ~MyString();             //деструктор
        void Print();            //метод печати строки на экран
        MyString operator+(MyString& s);  //операция + для склеивания двух строк
        MyString& operator=(MyString &s); //операция = (присвоение строк)
        MyString operator^(int value);
        MyString& operator+=(MyString &s);//операция += для склеивания двух строк
        char& operator[](int value);  //операция [] для доступа к отдельным символам строки
        bool operator==(MyString& s);  //операция проверки на равенство ==
        bool operator!=(MyString& s);  //операция проверки на неравенство !=
        friend ostream& operator<<(ostream& os, MyString& c);
        friend istream& operator>>(istream& is, MyString& c);
        bool Find(char *_str);         //метод поиска подстроки в строке
        bool FindSymbol(char symbol);  //метод поиска символа в строке
};
 
#endif
MyString.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "MyString.h"
#include <iostream>
using namespace std;
 
MyString::MyString(char *_str):str(new char[strlen(_str)+1])   
{
    strcpy(this->str,_str);
}
MyString::MyString():str(new char[1]){str[0]=0;}   
MyString::MyString(MyString &s):str(new char[strlen(s.str)+1])
{
    strcpy(this->str,s.str);
}
MyString::~MyString()
{
    delete [] this->str;
}
 
void MyString::Print()
{
    cout<<this->str<<endl;
}
MyString MyString::operator+(MyString& s)
{
    char *buf=new char[strlen(this->str)+strlen(s.str)+1];   
    strcpy(buf,this->str);
    return MyString(strcat(buf,s.str));    
}
MyString& MyString::operator=(MyString& s)
{
    delete[] this->str;       
    this->str=new char[strlen(s.str)+1];
    strcpy(this->str,s.str);
    return *this;
}
MyString& MyString::operator+=(MyString &s)
{
    *this=*this+s;
    return *this;
}
char& MyString::operator[](int value)
{
    return this->str[value];
}
bool MyString::operator==(MyString& s)
{
    if (strcmp(this->str,s.str)==0)
        return true;
    else
        return false;
}
bool MyString::operator!=(MyString& s)
{
    if (strcmp(this->str,s.str)==0)
        return false;
    else
        return true;
}
ostream& operator<<(ostream& os, MyString& c)
{
    return os<<c.str;
}
istream& operator>>(istream& is, MyString& c)
{
    char buf[2048];
    is>>buf;
    delete [] c.str;
    c.str=new char[strlen(buf)+1];
    strcpy(c.str,buf);
    return is;
}
bool MyString::Find(char *_str)
{
    if (strstr(this->str,_str)!=NULL)
        return true;
    else
        return false;
}
bool MyString::FindSymbol(char symbol)
{
    for (int i=0;i<strlen(this->str);i++)
        if (str[i]==symbol)
            return true;
    return false;
}
MyString MyString::operator^(int value)
{
    MyString buf;
    for (int i=0;i<value;i++)
        buf+=*this;
    return buf;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include "MyString.h"
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL,"rus");
    MyString N("Абракадабра");
    MyString O;
    MyString P(N);
    N.Print();
 
    MyString I("Строка");
    O=N+I;
    O+=I;
    O[0]='Б';
 
    if (N==P)
        cout<<"N=P"<<endl;;
    if (N!=P)
        cout<<"N<>P"<<endl;;
 
    MyString R;
    cout<<"Введите R:"<<endl;
    cin>>R;
    cout<<R<<endl;
 
    if (R.FindSymbol('к'))
        cout<<"В строке R содержится символ 'к'"<<endl;
    if (R.Find("брак"))
        cout<<"В строке R содержится подстрока 'брак'"<<endl;
 
    return 0;
}
0
Убежденный
Ушел с форума
Эксперт С++
15701 / 7211 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
03.06.2013, 17:32 #3
ViktorKozlov, а можно немного критики по существу ?



C++
1
using namespace std;
"using namespace" в заголовочном файле - зло.
В результате using вносится во все файлы, которые подключают этот заголовок,
даже туда, где она совсем не нужна.



C++
1
MyString(char * _str);   //конструктор с параметром в виде строковой константы
Конструктор с одним аргументом лучше помечать, как explicit, во
избежание случайных преобразований там, где их быть не должно.
Ну и здесь принято указывать const: "char const *_str", ведь
аргумент не изменяется.



C++
1
MyString(MyString& s);   //конструктор копирования
То же самое: где const ? Используя конструктор копирования с такой сигнатурой,
вы не сможете проинициализировать объект константой:
C++
1
2
MyString const str1;
MyString str2(str1); // ошибка !


C++
1
2
3
void Print();                   //метод печати строки на экран
bool Find(char *_str);          //метод поиска подстроки в строке
bool FindSymbol(char symbol);   //метод поиска символа в строке
Концептуально, эти методы в классе строки лишние.
MyString должен выполнять только свои прямые обязанности - хранение
строки, доступ к ней, обеспечение элементарных операций, остальное - это
уже из области алгоритмов. Кстати, а где метод size или length ?



C++
1
2
3
MyString operator+(MyString& s);  //операция + для склеивания двух строк
MyString& operator=(MyString &s); //операция = (присвоение строк)
MyString& operator+=(MyString &s);//операция += для склеивания двух строк
Где const ?



C++
1
MyString operator^(int value);
Это что за метод ?
Вообще, перегруженные операторы (да и вообще любые функции/методы/интерфейсы)
должны выполнять интуитивно понятные действия, см. "принцип наименьшего удивления".
Этот оператор непонятен. Что происходит в выражении "str^5" ? Волосы дыбом



C++
1
char& operator[](int value);  //операция [] для доступа к отдельным символам строки
Тип индекса лучше брать size_t. И опять позанудствую - где const-версия ?
Без нее вы не сможете читать символы константной строки.



C++
1
MyString::MyString():str(new char[1]){str[0]=0;}
А можно ли обойтись без выделения памяти для пустой строки ?



C++
1
2
3
4
5
6
7
MyString& MyString::operator=(MyString& s)
{
    delete[] this->str;       
    this->str=new char[strlen(s.str)+1];
    strcpy(this->str,s.str);
    return *this;
}
Некорректно. Нет проверки на присваивание самому себе.
Проверьте:
C++
1
2
MyString str("abcde");
str = str; // Что будет в str, как думаете ?
1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
03.06.2013, 17:40 #4

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
немного критики
Нишутя =) Катком проехался)))
FA-TALITY!



Альтернативный вариант =)
C++
1
typedef std::string MyString;
0
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
05.06.2013, 00:40 #5
Убежденный,
Согласен, недочетов много, просто делал это еще тогда, когда в универе перегруженные операторы только проходить начали.
Что касается лишних методов, то они были в самом задании по этой теме, а где на практике может использоваться оператор ^ для "умножения строки на саму себя", я сам затрудняюсь ответить
0
05.06.2013, 00:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 00:40
Привет! Вот еще темы с ответами:

Перегрузка операторов Mystring - C++
Добрый день. Работаю над собственным классом Mystring, в котором надо перегрузить операторы. class MyString{ private: char *str; ...

Создать класс Элемент списка (Node), а затем класс Список (List) - C++
Задание: Создать класс Элемент списка (Node), а затем класс Список (List). В зависимости от варианта список должен быть одно или...

Создать класс Point и производный класс ColoredPoint (цветная точка) - C++
Создайте класс Point (точка на плоскости), характеризующийся двумя координатами. Создайте производный класс ColoredPoint (цветная точка), в...

Создать Класс Coins (монеты). Класс сохраняет массив из 3 монет ... - C++
Помогите написать програмку, где: Нужно создать Класс Coins (монеты). Класс сохраняет массив из 3 монет и общее количество лицевых сторон...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru