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

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

Восстановить пароль Регистрация
 
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
27.12.2013, 02:59     Ошибка в перегрузке #1
Заголовок
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;
}
Здравствуйте дорогие форумчане. Собственно вот в чём проблема: после выполнения программы выскакивает ошибка. На быдлокод прошу не обращать внимания т.к. писалось бысто и "лишь бы работало". Думаю дело в утечке памяти. Буду благодарен если поможете. Спасибо.
Миниатюры
Ошибка в перегрузке  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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];
И перегрузка неудачна. Хорошо, когда перегрузка работает аналогично сложению для встроенных типов.
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
27.12.2013, 17:55  [ТС]     Ошибка в перегрузке #3
Цитата Сообщение от alsav22 Посмотреть сообщение
И перегрузка неудачна. Хорошо, когда перегрузка работает аналогично сложению для встроенных типов.
А можно правильную реализацию operator+?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.12.2013, 20:14     Ошибка в перегрузке #4
Ошибка исчезла?
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
27.12.2013, 22:09  [ТС]     Ошибка в перегрузке #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибка исчезла?
Вы абсолютно правы для нуль-символа небыло места. Спасибо)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.12.2013, 23:41     Ошибка в перегрузке #6
Цитата Сообщение от Sh0cK Посмотреть сообщение
для нуль-символа небыло места.
А это?
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут будет два указателя на одну и ту же память. Нужно память выделять и копировать туда строку.
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
28.12.2013, 00:54  [ТС]     Ошибка в перегрузке #7
А ту проблему я не проверял а сразу заменил на strcpy)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 03:51     Ошибка в перегрузке
Еще ссылки по теме:

C++ ошибка в перегрузке конструктора копирования
C++ Ошибка в перегрузке операторов?
C++ Ошибка в перегрузке оператора пересечения

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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;
}
Yandex
Объявления
28.12.2013, 03:51     Ошибка в перегрузке
Ответ Создать тему
Опции темы

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