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

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

Войти
Регистрация
Восстановить пароль
 
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
#1

свой класс string - C++

09.03.2013, 17:29. Просмотров 1014. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 17:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос свой класс string (C++):

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

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

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

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

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

Создать свой класс - C++
Помогите пожалуйста, сколько бьюсь уже не могу ничего найти что понятно мне будет... Как свой класс создать чтобы он хоть что-то делал,...

13
Кудаив
331 / 408 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
09.03.2013, 17:37 #2
операция конкатенации у тебя возвращает указатель и объекту s присваивается указатель...
пусть конкатенация возвращает временный объект или ссылку
1
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2013, 17:37 #3
Цитата Сообщение от 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
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 17:54  [ТС] #4
А меня еще вопрос: в задаче сказано вот такое: "Первый байт должен содержать информацию о фактическом количестве элементов массива.", Это как сделать, ко мне что-то никак не доходит ..?
0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
09.03.2013, 18:54 #5
Цитата Сообщение от The_bolT Посмотреть сообщение
А меня еще вопрос: в задаче сказано вот такое: "Первый байт должен содержать информацию о фактическом количестве элементов массива.", Это как сделать, ко мне что-то никак не доходит ..?
Хранить размер строки не в отдельной переменной, как это сделано у вас, а присвоить его первому элементу массива(cтрока при этом будет начинаться уже не с 0 индекса, а c 1).

Добавлено через 2 минуты
Т.е., задача, скорее всего, предполагает создание обёртки над простым символьным массивом фиксированного размера.
1
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 19:01  [ТС] #6
То есть размер массив никогда не будет больше чем 9?
0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
09.03.2013, 19:53 #7
Не 9, a 255(максимальное число, которое может поместиться в 1 байте) T.е., информационная часть массива 255 символов и +1 символ под '\0'.
0
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 19:59  [ТС] #8
Хорошо, а как тогда мне это число поместить в этот байт?
0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
09.03.2013, 20:45 #9
Цитата Сообщение от The_bolT Посмотреть сообщение
Хорошо, а как тогда мне это число поместить в этот байт?
Цитата Сообщение от rangerx Посмотреть сообщение
Хранить размер строки не в отдельной переменной, как это сделано у вас, а присвоить его первому элементу массива
char в C++, обычный целочисленный тип. Единственное что: при получении размера массива первый элемент необходимо будет предвартельно привести к unsigned char.
0
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 20:47  [ТС] #10
rangerx, я что-то не понимаю)char это один символ, а 255 это аж 3, то как можно записать это в одну ячейку????
0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
09.03.2013, 21:23 #11
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
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 21:26  [ТС] #12
rangerx, Ем .. то как мне записать туда число?)) Можно такой маленький пример?))
0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
09.03.2013, 21:31 #13
C++
1
2
char s[256];
s[0] = 10;
1
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 21:32  [ТС] #14
Хм .. и все?)) Так просто?
0
09.03.2013, 21:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 21:32
Привет! Вот еще темы с ответами:

Строки свой класс - C++
Вобщем в чем проблема, нужно реализовать строковый класс начальная структура такова Str.h #include &lt;iostream&gt; class MyString ...

Свой контейнерный класс - C++
Господа, помогите пожалуйста написать прогу. сама вообще не справляюсь: шаблоны и контейнеры понимаю с пятого на десятое. задание:...

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

Динамическая память, свой класс - C++
Есть свой класс. Пусть будет Class. У него есть потомки. SubClassA и SubClassB. Необходимо динамически выделить массив указателей на...


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

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

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