Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Arkanar
Сообщений: n/a
03.06.2013, 16:51     Создать класс MyString #1
Создать класс MyString, содержащий элемент данных указатель на массив типа char - текстовую строку. Конструктор класса с параметром (максимальной длиной строки) должен выделять память под размещение строки заданной длины. Переопределить для класса операцию + как конкатенации (склейки) двух строк. Создайте ,пожалуйста, если не сложно, также тестирующую оболочку, позволяющую продемонстрировать работу класса.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2013, 16:51     Создать класс MyString
Посмотрите здесь:

C++ Создать класс Matrix и класс Size
Создать класс! C++
C++ Класс: создать класс "Person"
Как создать класс кот может создать general purpose counting objects C++
Создать класс MyString C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
03.06.2013, 16:55     Создать класс MyString #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;
}
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,296
Завершенные тесты: 1
03.06.2013, 17:32     Создать класс MyString #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, как думаете ?
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
03.06.2013, 17:40     Создать класс MyString #4

Не по теме:

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



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

Текущее время: 13:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru