Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231

свой класс string

09.03.2013, 17:29. Показов 2942. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два вопроса: почему компилятор ругает вот это s = str + str2;? Хотя догадываюсь почему, скорее всего у меня не так реализован оператор контантенации +. И вот второй вопрос: как правильно реализовать оператор +?
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "String.h"
 
using namespace std;
 
int main()
{
    String str("Hello, "), str2("World!"),s; 
    //s = str + str2;
    cout<<s;
 
    system("pause>0");
    return 0;
}

String.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
#include "String.h"
#include <iostream>
 
using namespace std;
 
String* String::operator+(const String &tmp)
{
    String* temp;
    temp = new String[size + tmp.size + 1];
    temp->size = size + tmp.size;
    strcpy(temp->sPtr,sPtr);
    strcat(temp->sPtr,tmp.sPtr);
 
    return temp;
}
 
String &String::operator=(const String &tmp)
{
      if(&tmp != this){
                delete [] sPtr;
                size = tmp.size;
                sPtr = new char[size+1];
                strcpy(sPtr,tmp.sPtr);
          }
      return *this;
}
 
String::~String()
{
      delete [] sPtr;
}
 
String::String(const String &copy)
{
      size = copy.size;
      sPtr = new char[size+1];
      strcpy(sPtr,copy.sPtr);
}
 
String::String(const char *s)
{
      size = strlen(s);
      sPtr = new char[size+1];
      strcpy(sPtr,s);
}
 
int String::operator==(const String &right) const
{
    return strcmp(sPtr,right.sPtr)==0;
}
 
int String::operator!=(const String &right) const
{
    return strcmp(sPtr,right.sPtr)!=0;
}
 
int String::operator<(const String &right) const
{
    return strcmp(sPtr,right.sPtr)<0;
}
 
int String::operator>(const String &right) const
{
    return strcmp(sPtr,right.sPtr)>0;
}
 
int String::operator>=(const String &right) const
{
    return strcmp(sPtr,right.sPtr)>=0;
}
 
int String::operator<=(const String &right) const
{
    return strcmp(sPtr,right.sPtr)<=0;
}
 
ostream &operator<<(ostream &out, const String &S)
{
    out<<S.sPtr;
 
    return out;
}

String.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 String_h
#define String_h
 
#include <iostream>
 
using namespace std;
 
class String
{
    friend ostream &operator<<(ostream &,const String &);
public:
    String(const char * = "");
    String(const String &);
    ~String();
    /*---------------------------------*/
    int operator==(const String &) const;
    int operator!=(const String &) const;
    int operator<(const String &) const;
    int operator>(const String &) const;
    int operator>=(const String &) const;
    int operator<=(const String &) const;
    /*----------------------------------*/
    String &operator=(const String&);
    String* operator+(const String&);
private:
    char* sPtr;
    int size;
};
 
#endif
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2013, 17:29
Ответы с готовыми решениями:

Свой класс String
Небольшой набросок на класс String #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class String { struct...

Свой класс string
Всем доброго дня! Только начал разбираться с этим замечательным языком. Вот пытаюсь реализовать свой класс строки, но не могу понять в чем...

Свой класс String
Крашится в деструкторе на 99 строке. В момент вызова деструктора в объекте(типа char) класса есть данные, то есть деструктор не пытается...

13
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
09.03.2013, 17:37
операция конкатенации у тебя возвращает указатель и объекту s присваивается указатель...
пусть конкатенация возвращает временный объект или ссылку
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
09.03.2013, 17:37
Цитата Сообщение от The_bolT Посмотреть сообщение
как правильно реализовать оператор +?
реализовать оператор += как функцию-член класса, а оператор + как свободную функцию
C++
1
2
3
4
5
6
String operator + (const String& left, const String& right)
{
    String res(left);
    res += right;
    return res;
}
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 17:54  [ТС]
А меня еще вопрос: в задаче сказано вот такое: "Первый байт должен содержать информацию о фактическом количестве элементов массива.", Это как сделать, ко мне что-то никак не доходит ..?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.03.2013, 18:54
Цитата Сообщение от The_bolT Посмотреть сообщение
А меня еще вопрос: в задаче сказано вот такое: "Первый байт должен содержать информацию о фактическом количестве элементов массива.", Это как сделать, ко мне что-то никак не доходит ..?
Хранить размер строки не в отдельной переменной, как это сделано у вас, а присвоить его первому элементу массива(cтрока при этом будет начинаться уже не с 0 индекса, а c 1).

Добавлено через 2 минуты
Т.е., задача, скорее всего, предполагает создание обёртки над простым символьным массивом фиксированного размера.
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 19:01  [ТС]
То есть размер массив никогда не будет больше чем 9?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.03.2013, 19:53
Не 9, a 255(максимальное число, которое может поместиться в 1 байте) T.е., информационная часть массива 255 символов и +1 символ под '\0'.
0
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 19:59  [ТС]
Хорошо, а как тогда мне это число поместить в этот байт?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.03.2013, 20:45
Цитата Сообщение от The_bolT Посмотреть сообщение
Хорошо, а как тогда мне это число поместить в этот байт?
Цитата Сообщение от rangerx Посмотреть сообщение
Хранить размер строки не в отдельной переменной, как это сделано у вас, а присвоить его первому элементу массива
char в C++, обычный целочисленный тип. Единственное что: при получении размера массива первый элемент необходимо будет предвартельно привести к unsigned char.
0
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:47  [ТС]
rangerx, я что-то не понимаю)char это один символ, а 255 это аж 3, то как можно записать это в одну ячейку????
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.03.2013, 21:23
The_bolT, размер типа char в C++ всегда равен 1 байту. 1 байт = 8 бит(так уж сложилось ), т.е. 8 двоичных разрядов, каждый из которых может принимать значение 0 или 1, например(будем считать, что числа беззнаковые):
00000000 -> 0
00010100 -> 20
10101010 -> 170
...
и т.д. Следовательно минимальное число, которое можно поместить в 1 байт 00000000, а максимальное 11111111.
Переводим 11111111 в десятичную систему счисления
1 * 27 + 1 * 26 + 1 * 25 + 1 * 24 + 1 * 23 + 1 * 22 + 1 * 21 + 1 * 20 = 255
что и требовалось доказать
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 21:26  [ТС]
rangerx, Ем .. то как мне записать туда число?)) Можно такой маленький пример?))
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.03.2013, 21:31
C++
1
2
char s[256];
s[0] = 10;
1
73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 21:32  [ТС]
Хм .. и все?)) Так просто?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2013, 21:32
Помогаю со студенческими работами здесь

Здравствуйте! Создал класс std::string. Не создается объкт типа string... Подскажите в чем причина?
#include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; //using namespace std; class string { private: int...

Свой String
Ругается судя по всему на этот кусок кода(пишу свой string) MyString operator=(const MyString &amp;other) { if (this-&gt;str...

Реализовать пользовательские типы: класс Person и класс String
1)Разработать класс Person, который содержит соответствующие члены для хранения: имени, возраста, пола и телефонного номера. ...

Свой класс в С++
Пытаюсь сделать класс массива точнее переписать код из учебника, но так как код приводится не целый а кусками то что в данный момент...

Перенос данных из массива `свой класс` в List<string>
Хочу перенести все данные из массива своего класса который имеет несколько но надо переместить конкретную переменную в List&lt;string&gt;....


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru