0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
1

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

03.07.2017, 14:16. Показов 2897. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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; using namespace...

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

26
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
03.07.2017, 14:53 2
Persik, Скиньте описание Вашего класса.

Добавлено через 42 секунды
Цитата Сообщение от Persik Посмотреть сообщение
и почему ошибка выдается???
Какая ошибка? Где именно, в какой строке?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
03.07.2017, 15:30 3
Цитата Сообщение от Persik Посмотреть сообщение
оператора "+=" в классе MyString
а где ее реализация?
0
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
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
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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
Заблокирован
03.07.2017, 16:29 6
Цитата Сообщение от igdev Посмотреть сообщение
Только перегрузка вывода должна быть еще и дружественная:
Не учи плохому. Необходимость делать операторы дружественными или делать member-операторами те, которые могут быть non-member обычно говорит о кривом дизайне.
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
04.07.2017, 00:16 9
DrOffset,

Не по теме:


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

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

0
DrOffset
04.07.2017, 00:31
  #10

Не по теме:

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

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

1
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
04.07.2017, 14:11  [ТС] 11
А как добавить реализацию конкатенации строк через перегрузку оператора "+=" в классе MyString?
и еще я не поняла насчет Только перегрузка вывода должна быть еще и дружественная:
C++
1
friend std::ostream& operator<< (std::ostream& ostream, MyString& myStr);
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
04.07.2017, 15:18  [ТС] 13
igdev, Спасибо!!! Вы мне очень помогли!!!=))
0
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
04.07.2017, 15:51  [ТС] 14
У меня выходить ошибка!!!
Миниатюры
Реализация класса MyString. Стандартная библиотека, std::string, std::vector  
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
04.07.2017, 16:02 15
Persik,
Цитата Сообщение от Persik Посмотреть сообщение
У меня выходить ошибка!!!
Вы добавили прототип перегрузки операции в определение класса?

Добавлено через 1 минуту
А лучше, скиньте актуальную версию Вашего кода (и описание класса и его реализацию). Т.е. со всеми последними изменениями.
0
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
04.07.2017, 16:03  [ТС] 16
У меня такой вопрос, а как по другому написать this->?
C++
1
size_t newSz = this->size() + rhs.size();
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
04.07.2017, 16:41 17
Persik, Ну, можете попробовать еще так:
C++
1
size_t newSz = this.size() + rhs.size();
Добавлено через 1 минуту
Цитата Сообщение от Persik Посмотреть сообщение
У меня такой вопрос, а как по другому написать this->?
Хотя, я не понимаю, что Вас не устраивает?
0
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
04.07.2017, 16:57  [ТС] 18
Все, я решила!!!
0
0 / 0 / 1
Регистрация: 02.04.2009
Сообщений: 54
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
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2017, 14:22
Помогаю со студенческими работами здесь

Разбить std::string на std::vector
Задание: написать функцию которая разбивает строку на слова vector&lt;string&gt; void str_to_word...

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru