Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
1

Реализация класса MyString. Стандартная библиотека, std::string, std::vector

03.07.2017, 14:16. Просмотров 722. Ответов 26
Метки нет (Все метки)

как добавить реализацию конкатенации строк через перегрузку оператора "+=" в классе MyString и почему ошибка выдается???
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "MyString.h"
 
 
MyString::MyString(size_t capacity, size_t size):
    m_capacity(capacity),
    m_sz(size)
{
    if (m_capacity < m_sz)
        m_capacity = m_sz;
    if (m_capacity > 0)
        m_str = new char[m_capacity];
}
 
 
MyString::MyString(const MyString& myStr)
{
    m_sz = myStr.m_sz;
    m_capacity = myStr.m_sz;
    m_str = new char[m_capacity];
    
    for (int ind = 0; ind < m_sz; ind++)
        m_str[ind] = myStr.m_str[ind];
}
 
MyString::MyString(const char* myStr)
{
    size_t newSz = 0;
    for (; myStr[newSz]; newSz++);
 
    if (newSz == 0)
        return;
 
    m_str = new char[newSz];
 
    for (size_t ind = 0; ind < newSz; ind++)
        m_str[ind] = myStr[ind];
 
    m_sz = newSz;
    m_capacity = newSz;
}
 
char& MyString::operator[](size_t ind)
{
    if (ind >= m_sz)
        throw;
    return m_str[ind];
}
 
bool MyString::operator>(MyString& rhs)
{
    size_t minSz = (m_sz < rhs.m_sz) ? m_sz : rhs.m_sz;
 
    for (size_t ind = 0; ind < minSz; ind++)
    {
        if (toLower(m_str[ind]) > toLower(rhs.m_str[ind]))
            return true;
        else if (toLower(m_str[ind]) < toLower(rhs.m_str[ind]))
            return false;
    }
 
    // раз дошли до этой строки, значит начальные части строк эквивалентные, и больше та, которая длиннее
    if (m_sz > rhs.m_sz)
        return true;
    else
        return false;
}
 
bool MyString::operator<(MyString& rhs)
{
    size_t minSz = (m_sz < rhs.m_sz) ? m_sz : rhs.m_sz;
 
    for (size_t ind = 0; ind < minSz; ind++)
    {
        if (toLower(m_str[ind]) > toLower(rhs.m_str[ind]))
            return false;
        else if (toLower(m_str[ind]) < toLower(rhs.m_str[ind]))
            return true;
    }
 
    // раз дошли до этой строки, значит начальные части строк эквивалентные, и больше та, которая длиннее
    if (m_sz < rhs.m_sz)
        return true;
    else
        return false;
}
 
char MyString::toLower(char ch)
{
    // Только латинские буквы, русские на типе char, уже работают на моих двух машинах по разному
    if (ch >= 'A' && ch <= 'Z')
    {
        short dif = 'A' - 'a';
        ch -= dif;
    }
 
    return ch;
}
 
MyString& MyString::operator=(MyString& rhs)
{
    // Зачищаю старую строку
    delete []m_str;
    if (rhs.m_sz == 0)
    {
        m_sz = m_capacity = 0;
    }
    
    m_str = new char[rhs.m_sz];
    m_sz = m_capacity = rhs.m_sz;
    for (size_t ind = 0; ind < m_sz; ind++)
        m_str[ind] = rhs[ind];
 
    return *this;
}
 
bool MyString::operator==(MyString& rhs)
{
    if (m_sz != rhs.m_sz)
        return false;
 
    for (size_t ind = 0; ind < m_sz; ind++)
    {
        char lVal = m_str[ind], rVal = rhs.m_str[ind];
 
        if (toLower(m_str[ind]) != toLower(rhs.m_str[ind]))
            return false;
    }
 
    return true;
}
 
MyString::~MyString()
{
    delete []m_str;
}
 
std::ostream& operator<<(std::ostream& out, MyString& myStr)
{
    size_t sz = myStr.size();
    for (size_t ind = 0; ind < sz; ind++)
        out << myStr[ind];
    //out << std::endl;
 
    return out;
}
 
MyString operator+(MyString& lhs, MyString& rhs)
{
    size_t newSz = lhs.size() + rhs.size();
    MyString concStr(newSz, newSz);
 
    size_t concInd = 0;
    size_t leftSz = lhs.size();
    size_t rightSz = rhs.size();
 
    for (size_t ind = 0; ind < leftSz; ind++)
        concStr[concInd++] = lhs[ind];
 
    for (size_t ind = 0; ind < rightSz; ind++)
        concStr[concInd++] = rhs[ind];
 
    return concStr;
}
 
MyString operator+(const char* lhCharStr, MyString& rhs)
{
    MyString lhs(lhCharStr);
    return lhs + rhs;
}
 
MyString operator+(MyString& lhs, const char* rhCharStr)
{
    MyString rhs(rhCharStr);
    return lhs + rhs;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2017, 14:16
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в...

Передача функции указатель на элемент std::vector<std::string>
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть...

Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &'
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;sstream&gt; #include &lt;string&gt; ...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2...

Реализовать аналог класса std::string с помощью vector
Помогите, пожалуйста, с кодом к заданию: Реализовать аналог класса...

26
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
03.07.2017, 14:53 2
Persik, Скиньте описание Вашего класса.

Добавлено через 42 секунды
Цитата Сообщение от Persik Посмотреть сообщение
и почему ошибка выдается???
Какая ошибка? Где именно, в какой строке?
0
Antikl
с++
296 / 288 / 154
Регистрация: 15.07.2015
Сообщений: 1,547
Завершенные тесты: 6
03.07.2017, 15:30 3
Цитата Сообщение от Persik Посмотреть сообщение
оператора "+=" в классе MyString
а где ее реализация?
0
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
03.07.2017, 15:46  [ТС] 4
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
31
32
33
34
35
36
37
38
39
40
41
#pragma once
 
#include <iostream>
 
class MyString
{
public:
    
    MyString(size_t capacity = 0, size_t size = 0);
    ~MyString();
    MyString(const MyString& myStr);
    MyString(const char* myStr);
 
    inline size_t size() const { return m_sz; }
 
    char& operator[] (size_t ind);
    bool operator> (MyString& rhs);
    bool operator< (MyString& rhs);
    bool operator== (MyString& rhs);
    bool operator!= (MyString& rhs) { return !(rhs == *this); }
 
    MyString& operator= (MyString& rhs);
 
    friend MyString operator+(MyString& lhs, MyString& rhs);
 
private:
    char toLower(char ch);
 
   
    char* m_str;
   
    size_t m_sz;
   
    size_t m_capacity;
};
 
std::ostream& operator<< (std::ostream& ostream, MyString& myStr);
 
MyString operator+ (MyString& lhs, MyString& rhs);
MyString operator+ (const char* lhs, MyString& rhs);
MyString operator+ (MyString& lhs, const char* rhs);
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
03.07.2017, 16:07 5
Persik, Ошибку у Вас выдает по всей видимости из-за того, что Вы описуете перегрузку оператора в классе только для одного случая
C++
1
 friend MyString operator+(MyString& lhs, MyString& rhs);
а дальше пытаетесь еще пару случаев реализовать:
C++
1
2
3
MyString operator+ (MyString& lhs, MyString& rhs);
MyString operator+ (const char* lhs, MyString& rhs);
MyString operator+ (MyString& lhs, const char* rhs);
Это должно быть в описании класса.

Добавлено через 1 минуту
И это тоже:
C++
1
std::ostream& operator<< (std::ostream& ostream, MyString& myStr);
Только перегрузка вывода должна быть еще и дружественная:
C++
1
friend std::ostream& operator<< (std::ostream& ostream, MyString& myStr);
0
dawn artist
Заблокирован
03.07.2017, 16:29 6
Цитата Сообщение от igdev Посмотреть сообщение
Только перегрузка вывода должна быть еще и дружественная:
Не учи плохому. Необходимость делать операторы дружественными или делать member-операторами те, которые могут быть non-member обычно говорит о кривом дизайне.
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
03.07.2017, 16:33 7
daun-autist,
Цитата Сообщение от daun-autist Посмотреть сообщение
Не учи плохому. Необходимость делать операторы дружественными или делать member-операторами те, которые могут быть non-member обычно говорит о кривом дизайне.

Не по теме:


Извините, не знал. Те задачки, которые мне приходилось решать на перегрузку операторов, то там всегда оператор вывода был дружественный.
P.S. Задачки решал по книге Дейтела "Как программировать на С++". Там после каждой главы есть задачки.

0
DrOffset
04.07.2017, 00:09
  #8

Не по теме:

Цитата Сообщение от igdev Посмотреть сообщение
там всегда оператор вывода был дружественный
Просто нужно уметь оценивать когда его нужно делать дружественным, а когда нет.
Есть книга "Стандарты программирования на C++", там в том числе и этот вопрос подробнее раскрывается.

0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
04.07.2017, 00:16 9
DrOffset,

Не по теме:


Цитата Сообщение от DrOffset Посмотреть сообщение
Есть книга "Стандарты программирования на C++"
Стандарты программирования на С++. 101 правило и рекомендация. Герб Саттер Андрей Александреску

Это та книга? Я правильно нашел в гугле?

0
DrOffset
04.07.2017, 00:31
  #10

Не по теме:

Цитата Сообщение от igdev Посмотреть сообщение
Это та книга? Я правильно нашел в гугле?
Она, да.

Добавлено через 11 минут
Правило 44

1
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
04.07.2017, 14:11  [ТС] 11
А как добавить реализацию конкатенации строк через перегрузку оператора "+=" в классе MyString?
и еще я не поняла насчет Только перегрузка вывода должна быть еще и дружественная:
C++
1
friend std::ostream& operator<< (std::ostream& ostream, MyString& myStr);
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
04.07.2017, 14:54 12
Persik,
Цитата Сообщение от Persik Посмотреть сообщение
А как добавить реализацию конкатенации строк через перегрузку оператора "+=" в классе MyString?
Вроде, вот так. Без коментариев в коде трудно понять, что у Вас там происходит и для чего.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MyString operator+=(MyString& rhs)
{
    size_t newSz = this->size() + rhs.size();
    char *currPtr = new char[newSz];
    strcpy(currPtr, m_str);
    strcat(currPtr, rhs.m_str);
    delete m_str;
    
    size = newSz;
    m_str = new char[size];
    strcpy(m_str, currPtr);
    delete currPtr;
 
    return this;
}
Добавлено через 2 минуты
Цитата Сообщение от Persik Посмотреть сообщение
и еще я не поняла насчет Только перегрузка вывода должна быть еще и дружественная:
friend std::ostream& operator<< (std::ostream& ostream, MyString& myStr);
Это решать уже Вам, стоит ли добавлять дружественность или нет, т.к.
Цитата Сообщение от daun-autist Посмотреть сообщение
Необходимость делать операторы дружественными или делать member-операторами те, которые могут быть non-member обычно говорит о кривом дизайне.
1
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
04.07.2017, 15:18  [ТС] 13
igdev, Спасибо!!! Вы мне очень помогли!!!=))
0
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
04.07.2017, 15:51  [ТС] 14
У меня выходить ошибка!!!
0
Миниатюры
Реализация класса MyString. Стандартная библиотека, std::string, std::vector  
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
04.07.2017, 16:02 15
Persik,
Цитата Сообщение от Persik Посмотреть сообщение
У меня выходить ошибка!!!
Вы добавили прототип перегрузки операции в определение класса?

Добавлено через 1 минуту
А лучше, скиньте актуальную версию Вашего кода (и описание класса и его реализацию). Т.е. со всеми последними изменениями.
0
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
04.07.2017, 16:03  [ТС] 16
У меня такой вопрос, а как по другому написать this->?
C++
1
size_t newSz = this->size() + rhs.size();
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
04.07.2017, 16:41 17
Persik, Ну, можете попробовать еще так:
C++
1
size_t newSz = this.size() + rhs.size();
Добавлено через 1 минуту
Цитата Сообщение от Persik Посмотреть сообщение
У меня такой вопрос, а как по другому написать this->?
Хотя, я не понимаю, что Вас не устраивает?
0
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
04.07.2017, 16:57  [ТС] 18
Все, я решила!!!
0
Persik
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 49
11.07.2017, 11:07  [ТС] 19
В продолжение. В классе MyString функции ToLower() - переводящие все символы из верхнего регистра в нижний регистр, и функцию ToUpper() - из нижнего регистра в верхних. Изменять надо массив m_str в самом классе.

MyString.h
C++
1
2
3
4
5
6
7
#include <iostream>
class MyString
{
public:
MyString ToLower(MyString& m_str);
MyString ToUpper(MyString& m_str);
};
MyString.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "MyString.h"
MyString MyString::ToUpper(MyString& m_str){
    MyString temp(*this);
    for (int i = 0; i [COLOR="Red"]<[/COLOR] m_str; i++)
        if (m_str[i] >= 'a' && m_str[i] <= 'z')
            m_str[i] = m_str[i] - 'a' + 'A';
    return *this;
}
 
 
MyString MyString::ToLower(MyString& m_str){
    MyString temp(*this);
    for (int i = 0; i [COLOR="Red"]<[/COLOR] m_str; i++)
        if (m_str[i] >= 'A' && m_str[i] <= 'Z')
            m_str[i] = 'A' - 'a';
    
    return *this;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "MyString.h"
using namespace std;
 
int main()
{
 
    MyString ToUpper = MyString("Hello, Cyberforum!");
    MyString ToLower = MyString("Hello, world!");
    
    system("pause");
    return 0;
}
У меня ошибка выходит IntelliSense: no operator "<" matches these operands operand types are: int < MyString c:\Users\bsb\Desktop\дом\MyString.cpp (выделенные красным цветом)
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
11.07.2017, 14:22 20
Persik, Массив - это указатель на первый элемент. Вам же в цикле нужно полностью проходить по всему массиву.
Поэтому, вместо этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MyString MyString::ToUpper(MyString& m_str){
    MyString temp(*this);
    for (int i = 0; i < m_str; i++)
        if (m_str[i] >= 'a' && m_str[i] <= 'z')
            m_str[i] = m_str[i] - 'a' + 'A';
    return *this;
}
 
 
MyString MyString::ToLower(MyString& m_str){
    MyString temp(*this);
    for (int i = 0; i < m_str; i++)
        if (m_str[i] >= 'A' && m_str[i] <= 'Z')
            m_str[i] = 'A' - 'a';
    
    return *this;
}
Нужно писать это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MyString MyString::ToUpper(MyString& m_str){
    MyString temp(*this);
    for (int i = 0; i < m_sz; i++)
        if (m_str[i] >= 'a' && m_str[i] <= 'z')
            m_str[i] = m_str[i] - 'a' + 'A';
    return *this;
}
 
 
MyString MyString::ToLower(MyString& m_str){
    MyString temp(*this);
    for (int i = 0; i < m_sz; i++)
        if (m_str[i] >= 'A' && m_str[i] <= 'Z')
            m_str[i] = 'A' - 'a';
    
    return *this;
}
Т.е. нужно указывать размер массива.
1
11.07.2017, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2017, 14:22

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так....

Вывести значения std::vector<std::vector<int*> >
Подскажите, как вывести значения? const size_t row = 3; const size_t col =...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: ...


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

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

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