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

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

Войти
Регистрация
Восстановить пароль
 
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
#1

Ошибка в перегрузке - C++

27.12.2013, 02:59. Просмотров 259. Ответов 7
Метки нет (Все метки)

Заголовок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef CHALLENGE_H
#define CHALLENGE_H
#include <ostream>
using std::ostream;
 
class Stringos
{
    friend ostream &operator<<( ostream &, const Stringos & );
public:
    Stringos( const char *s );
    ~Stringos();
    const Stringos &operator+( Stringos &);
    const Stringos &operator=( Stringos &);
private:
    int length;
    char * sPtr;
};
 
#endif
Реализация функций
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
#include "Challenge.h"
#include <cstring>
#include <ostream>
using std::ostream;
 
Stringos::Stringos( const char *s ) 
    : length( ( s != 0 ) ? strlen( s ) : 0 ) 
{ 
    sPtr = new char[ length +1 ];
    if ( s != 0 )
        strcpy( sPtr, s );
    else
        sPtr[ 0 ] = '\0';
 
}
 
Stringos::~Stringos()
{
    delete [] sPtr;
}
 
const Stringos& Stringos::operator+( Stringos &strings )
{
    char *timePtr=new char[length+strings.length];
    strcpy(timePtr, sPtr);
    strcpy(timePtr+length, strings.sPtr);
    delete [] sPtr;
    length+=strings.length;
    sPtr = timePtr;
    return *this;
}
 
const Stringos& Stringos::operator=( Stringos &strings )
{
    delete [] sPtr;
    length=strings.length;
    sPtr = strings.sPtr;
    return *this;
}
 
ostream &operator<<( ostream &output, const Stringos &strings)
{
    output << strings.sPtr;
    return output; 
}
мэйн
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using std::cout;
 
#include "Challenge.h"
 
int main()
{
    Stringos string1("happy");
    Stringos string2(" birthday");
    Stringos string3("");
    string1+string2;
    string3=string1;
    cout << string3;
    return 0;
}
Здравствуйте дорогие форумчане. Собственно вот в чём проблема: после выполнения программы выскакивает ошибка. На быдлокод прошу не обращать внимания т.к. писалось бысто и "лишь бы работало". Думаю дело в утечке памяти. Буду благодарен если поможете. Спасибо.
0
Миниатюры
Ошибка в перегрузке  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2013, 02:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в перегрузке (C++):

Ошибка в перегрузке оператора += - C++
#include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; const int da=256; class stroki { public: stroki(); ...

Ошибка в перегрузке операторов? - C++
не могу понять в чем ошибка class cMatrix { private: int rows; int columns; public:

Ошибка в перегрузке операций - C++
Долго сижу и никак не могу понять в чём ошибка. Вот 3 файла. Они подключены правильно и работают. main.cpp #include &lt;iostream&gt; ...

Ошибка в перегрузке операции - C++
Здравствуйте, помогите пожалуйста исправить ошибка: выражение слева от &quot;.summa&quot; должно представлять класс, структуру или объединение ...

Ошибка в перегрузке оператора = - C++
В классе множество нужно перегрузить оператор = так, чтобы была возможность присвоить f(x)=const. Подскажите, где ошибка в этом коде. ...

Ошибка в перегрузке оператора - C++
Не пойму в чем дело(( Имеется класс вектор ,вычислил длину,а теперь очу сравнить их величины,но не могу составить данный оператор выдает...

7
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.12.2013, 05:32 #2
Цитата Сообщение от Sh0cK Посмотреть сообщение
const Stringos& Stringos::operator=( Stringos &strings )
{
* * delete [] sPtr;
* * length=strings.length;
* * sPtr = strings.sPtr;
* * return *this;
}
Тут будет два указателя на одну и ту же память. Нужно память выделять и копировать туда строку.
Памяти мало вделяется для копирования в operator+. Нужно добавить для '\0':
C++
1
char *timePtr = new char[length + strings.length + 1];
И перегрузка неудачна. Хорошо, когда перегрузка работает аналогично сложению для встроенных типов.
1
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
27.12.2013, 17:55  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
И перегрузка неудачна. Хорошо, когда перегрузка работает аналогично сложению для встроенных типов.
А можно правильную реализацию operator+?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.12.2013, 20:14 #4
Ошибка исчезла?
1
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
27.12.2013, 22:09  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибка исчезла?
Вы абсолютно правы для нуль-символа небыло места. Спасибо)
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.12.2013, 23:41 #6
Цитата Сообщение от Sh0cK Посмотреть сообщение
для нуль-символа небыло места.
А это?
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут будет два указателя на одну и ту же память. Нужно память выделять и копировать туда строку.
1
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
28.12.2013, 00:54  [ТС] #7
А ту проблему я не проверял а сразу заменил на strcpy)
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 03:51 #8
Цитата Сообщение от Sh0cK Посмотреть сообщение
А можно правильную реализацию operator+?
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
class Stringos
{
    friend ostream &operator<<( ostream &, const Stringos & );
public:
    Stringos( const char *s );
    Stringos( const Stringos &);
    ~Stringos();
    friend const Stringos operator+( const Stringos &, const Stringos &);
    Stringos &operator=( const Stringos &);
private:
    int length;
    char * sPtr;
};
 
 
Stringos::Stringos( const char *s ) 
    : length( ( s != 0 ) ? strlen( s ) : 0 ) 
{ 
    sPtr = new char[ length + 1 ];
    if ( s != 0 )
        strcpy( sPtr, s );
    else
        sPtr[ 0 ] = '\0';
 
}
 
Stringos::Stringos( const Stringos &strings)
{
    length = strings.length;
    sPtr = new char[length + 1];
    strcpy(sPtr, strings.sPtr);
}
 
Stringos::~Stringos()
{
    delete [] sPtr;
}
 
const Stringos operator+( const Stringos &strings_l,  const Stringos &strings_r )
{
    char *timePtr = new char[strings_l.length + strings_r.length + 1];
    strcpy(timePtr, strings_l.sPtr);
    strcat(timePtr, strings_r.sPtr);
    Stringos strings_s( timePtr);
    delete [] timePtr;
    return strings_s;
}
 
Stringos& Stringos::operator=( const Stringos &strings )
{
    if (&strings == this) return *this;
    delete [] sPtr;
 
    length = strings.length;
    sPtr = new char[length + 1];
    strcpy(sPtr, strings.sPtr);
    
    return *this;
}
 
ostream &operator<<( ostream &output, const Stringos &strings)
{
    output << strings.sPtr;
    return output; 
}
 
int main()
{
    
    Stringos string1("happy");
    Stringos string2(" birthday");
    Stringos string3("");
    string3 = string1 + string2;
    cout << string3;
    
    return 0;
}
1
28.12.2013, 03:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 03:51
Привет! Вот еще темы с ответами:

Ошибка при перегрузке + - C++
Что не так? error C2601: Matrica::operator +: недопустимые локальные определения функций #pragma once class Matrica { public: ...

Ошибка при перегрузке оператора >> - C++
Приветствую. Есть 2 класса: enum Color { white = 1, red, green, blue, yellow }; class Shape { protected: Color figureCol; ...

Ошибка при перегрузке операторов. - C++
Здравствуйте! Возникла необходимость создать свой класс-обертку для работы с большими числами. Бибилиотека mpir=порт GMP. Пример рабочий:...

Ошибка при перегрузке функций - C++
Помогите, пожалуйста. Вылетает ошибка floating point stack check на строчке 16 кода (код ниже). Summa.Real=a.Real+b.Real; Не могу понять,...


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

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

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