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

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

Войти
Регистрация
Восстановить пароль
 
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
#1

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

02.02.2013, 19:06. Просмотров 520. Ответов 7
Метки нет (Все метки)

объясните, пожалуйста, что не так:

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++
Необходимо составить описание класса для определения одномерных массивов целых чисел. Границы индексов можно задавать произвольно, т.е....

Класс String, перегрузка сложения и вычитания - C++
Здравствуйте! Нужно сделать класс String с перегруженными операторами ==; &lt;;&gt;;+ и - вот код Header #ifndef STRING_H ...

Операторы сложения и присваивания - C++
здравствуйте. допустим у меня есть класс A. В этом классе содержатся функции : A operator=(A &amp;ob); friend A operator+(A &amp;ob1, A...

Перегрузка присваивания списка - C++
что в перегрузке не так вот код #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;time.h&gt; using namespace std; class...

Перегрузка оператора присваивания - C++
Добрый вечер. Есть задание: Нужно так перегрузить оператор =, чтобы можно было элементу одного класса, присваивать значение элемента...

Деструктор вызывается для результата сложения ДО присваивания, и дальше все падает. - C++
Подскажите пожалуйста! Написал класс матриц с перегруженными операторами class Matrix3d{ public: double** matrix; Matrix3d(); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 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!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 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!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 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++
Вечер добрый! Возникла проблема с перегрузкой операторов: dQuaternion dQuaternion :: operator*(dQuaternion&amp; QuatP) { dQuaternion...

Перегрузка операторов, оператор присваивания - C++
Перегрузка операторов, запутано-намутано #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;iostream&gt; using namespace::std; ...

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

Перегрузка присваивания, не могу найти ошибку - C++
В общем в классе матрицы, нужно перегрузить &quot;+&quot; и &quot;=&quot; С &quot;+&quot; проблем вроде бы не возникло, но вот с &quot;=&quot; не получилось Уже второй день не...


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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 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. перегрузка присваивания и сложения
Ответ Создать тему
Опции темы

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