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

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

Восстановить пароль Регистрация
 
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 17:29     свой класс string #1
Есть два вопроса: почему компилятор ругает вот это 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 17:29     свой класс string
Посмотрите здесь:

Класс Person. Класс String C++
Свой класс String C++
Свой класс string C++
C++ свой контейнерный класс
Свой класс в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
09.03.2013, 17:37     свой класс string #2
операция конкатенации у тебя возвращает указатель и объекту s присваивается указатель...
пусть конкатенация возвращает временный объект или ссылку
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2013, 17:37     свой класс string #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;
}
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 17:54  [ТС]     свой класс string #4
А меня еще вопрос: в задаче сказано вот такое: "Первый байт должен содержать информацию о фактическом количестве элементов массива.", Это как сделать, ко мне что-то никак не доходит ..?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
09.03.2013, 18:54     свой класс string #5
Цитата Сообщение от The_bolT Посмотреть сообщение
А меня еще вопрос: в задаче сказано вот такое: "Первый байт должен содержать информацию о фактическом количестве элементов массива.", Это как сделать, ко мне что-то никак не доходит ..?
Хранить размер строки не в отдельной переменной, как это сделано у вас, а присвоить его первому элементу массива(cтрока при этом будет начинаться уже не с 0 индекса, а c 1).

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

C++ Создать свой класс
Создать свой класс C++
Строки свой класс C++

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

Или воспользуйтесь поиском по форуму:
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
09.03.2013, 21:32  [ТС]     свой класс string #14
Хм .. и все?)) Так просто?
Yandex
Объявления
09.03.2013, 21:32     свой класс string
Ответ Создать тему
Опции темы

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