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

класс strtype. перегрузка присваивания и сложения - C++

Восстановить пароль Регистрация
 
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
02.02.2013, 19:06     класс strtype. перегрузка присваивания и сложения #1
объясните, пожалуйста, что не так:

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
# include <iostream>
using namespace std;
 
class strtype
{
    char *p;
    int len;
public:
    strtype(char *c){
        len=strlen(c);
        p = new char[len];
        if (!p)
        {
            cout<<"Memory allocation error!!!";
            exit(1);
        }
        strcpy(c, p);
    }
 
    ~strtype(){ delete []p; }
    void show();
 
    strtype operator= (strtype &s);
    friend strtype operator+ (strtype s1, strtype s2);
};
 
void strtype :: show(){
    for (int i = 0; i < len; ++i)
    {
        cout<<p[i];
    }
    cout<<endl;
}
 
strtype strtype :: operator= (strtype &s){
    if (s.len>len)
    {
        delete p;
        p= new char[s.len+1];
        if (!p)
        {
            cout<<"Memory allocation error!!!";
            exit(1);
        }
    }
    len=s.len;
    strcpy(s.p, p);
    return *this;
}
 
strtype operator+ (strtype s1, strtype s2){
    strtype tmp(" ");
    tmp.len=s1.len+s2.len;
    tmp.p=s1.p+s1.p;
    return tmp;
}
 
int main(int argc, char const *argv[])
{
    strtype a1("Wolf"), a2("Rabbit"), a3("_"), a4(" ");
    a1.show(); a2.show(); a3.show(); 
    a4=a2+a3+a1;
    a4.show();
 
    cin.get(); cin.ignore();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2013, 19:06     класс strtype. перегрузка присваивания и сложения
Посмотрите здесь:

C++ Операторы сложения и присваивания
C++ Перегрузка оператора присваивания
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания
Перегрузка операции присваивания и сложения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.02.2013, 19:58     класс strtype. перегрузка присваивания и сложения #2
как минимум, нужен конструктор копирования.
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
03.02.2013, 14:05  [ТС]     класс strtype. перегрузка присваивания и сложения #3
Цитата Сообщение от DU Посмотреть сообщение
нужен конструктор копирования.
зачем? у меня же присваивание перегружено

Добавлено через 2 часа 29 минут
Цитата Сообщение от Dummy_1 Посмотреть сообщение
присваивание перегружено
правильно ли?

Добавлено через 2 часа 2 минуты
выше
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
03.02.2013, 14:35     класс strtype. перегрузка присваивания и сложения #4
Цитата Сообщение от Dummy_1 Посмотреть сообщение
зачем? у меня же присваивание перегружено
Ну и что с того? При создании объекта вызывается конструктор, а не оператор присваивания.
Цитата Сообщение от Dummy_1 Посмотреть сообщение
правильно ли?
Стоит аргументом принимать ссылку на константу (иначе не получиться вызвать оператор для константного объекта), а возвращать ссылку, а не значение.
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
03.02.2013, 14:38  [ТС]     класс strtype. перегрузка присваивания и сложения #5
ну кто-нибудь объясните мне
разобраться охота )

Добавлено через 2 минуты
gray_fox, ясно.
а как синтаксис выглядит?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
03.02.2013, 14:40     класс strtype. перегрузка присваивания и сложения #6
Цитата Сообщение от Dummy_1 Посмотреть сообщение
а как синтаксис выглядит?
Прототип конструктора копирования? Так:
C++
1
strtype(strtype const& rhs)
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
03.02.2013, 14:52  [ТС]     класс strtype. перегрузка присваивания и сложения #7
gray_fox, фигня какая-то получилась.

вот код конструктора копирования
C++
1
2
3
4
5
6
7
8
9
strtype :: strtype (strtype const &c){
    p=new char[c.len];
    if (!p)
        {
            cout<<"Memory allocation error!!!";
            exit(1);
        }
    strcpy(c, p);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2013, 15:38     класс strtype. перегрузка присваивания и сложения
Еще ссылки по теме:

Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания
C++ Класс String, перегрузка сложения и вычитания

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
03.02.2013, 15:38     класс strtype. перегрузка присваивания и сложения #8
Цитата Сообщение от Dummy_1 Посмотреть сообщение
p=new char[c.len];
len - длинна строки? Тогда
C++
1
p = new char[c.len + 1];
иначе завершающий '\0' некуда будет писать.
Цитата Сообщение от Dummy_1 Посмотреть сообщение
strcpy(c, p);
C++
1
strcpy(p, c.p);
Цитата Сообщение от Dummy_1 Посмотреть сообщение
C++
1
2
3
4
5
6
7
strtype(char *c){
   len=strlen(c);
   p = new char[len];
   if (!p) {
      cout<<"Memory allocation error!!!"; exit(1);
   }
    strcpy(c, p); }
C++
1
2
3
4
5
strtype(char const* c) : len(strlen(c)) {
   p = new char[len + 1];
   if (!p) { //... }
   strcpy(p, c);
}
Добавлено через 9 минут
Цитата Сообщение от Dummy_1 Посмотреть сообщение
C++
1
2
3
4
5
6
strtype operator+ (strtype s1, strtype s2){
   strtype tmp(" ");
   tmp.len=s1.len+s2.len;
   tmp.p=s1.p+s1.p;
   return tmp;
}
Как-нибудь уж так хотя бы, хотя тоже криво:
C++
1
2
3
4
5
6
7
8
9
strtype operator +(strtype const& s1, strtype const& s2) {
   strtype result("");
   delete[] result.p;
   int length = s1.len + s2.len;
   result.len = length;
   result.p = new char[length + 1];
   strcpy(strcpy(p, s1.p), s2.p);
   return result;
}
Добавлено через 27 минут
Да, кстати не сразу заметил: оператор new/new[], в отличии от malloc/calloc/realloc, при неудачном выделении не возвращает ноль, а выбрасывает исключение std::bad_alloc, так что если охота проверить, то надо ловить это исключение:
C++
1
2
3
try {
   p = new char[len + 1];
} catch (std::bad_alloc const& error) { /* ... */ }
или использовать nothrow new[]:
C++
1
2
p = new (std::nothrow) char[len + 1];
if (!p) { /* ... */ }
Yandex
Объявления
03.02.2013, 15:38     класс strtype. перегрузка присваивания и сложения
Ответ Создать тему
Опции темы

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