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

Перегрузка оператора - C++

Восстановить пароль Регистрация
 
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
16.12.2012, 19:17     Перегрузка оператора #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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//Добавить в строковый класс функцию, которая создает строку, содержащую пересечение двух строк, 
//то есть общие символы для двух строк. Например, результатом пересечения строк "sdqcg" "rgfas34" будет строка "sg". 
//Для реализации функции перегрузить оператор * (бинарное умножение). 
 
#include <iostream>;
#include <string.h>
#include <conio.h>
using namespace std;
 
class String
{
    char *str;
    int len;
public:
    String();
    String(char *s);
    String(const String&);
    ~String();
    String operator*(const String&);
    void Show();
};
String :: String ()
{
    str = new char[];
    len = 0;
    str[0] = '\0';
}
 
String :: String (char *s)
{
    len = strlen(s);
    str = new char [len + 1];
    strcpy(str, s);
}
 
String :: String(const String& obj)
{
    len = obj.len;
    str = new char [len + 1];
    strcpy(str, obj.str);
}
 
String :: ~String()
{
    delete [] str;
}
 
void String :: Show()
{
    puts(str);
    cout << endl;
}
 
String String :: operator*(const String& obj)
{
    String temp;
 
    int *array = new int[len];
    int meter = 0;
 
    for(int i = 0; i < len; ++i)
    {
        for(int j = 0; j < obj.len; ++j)
        {
            if(str[i] == obj.str[j])
            {
                array[meter++] = i;
                break;
            }
        }
    }
 
    int meter2 = 0;
 
    for(int i = 0; i < meter; ++i)
    {
        temp.str[i] = str[array[i]];
    }
//вот здесь она, "гадина", и сидит!!!
    return temp;
}
 
int main(){
    
    String str1("abcdefj");
    String str2("defjhkl");
    String str3;
 
    str3 = str1 * str2;
    str3.Show();
 
    getch();
}
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 19:17     Перегрузка оператора
Посмотрите здесь:

C++ Перегрузка оператора %
Перегрузка оператора = C++
Перегрузка оператора C++
C++ перегрузка оператора
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
16.12.2012, 19:26     Перегрузка оператора #2
А скиньте лог ошибок пожалуйста)
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
16.12.2012, 20:28  [ТС]     Перегрузка оператора #3
Лог не выводит, но я думаю, что шибка связана с выходом за пределы массива temp.str .
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
16.12.2012, 20:54     Перегрузка оператора #4
Просто откуда вы узнали об ошибке. Что не так происходит
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
16.12.2012, 20:55     Перегрузка оператора #5
Цитата Сообщение от OdessaNA Посмотреть сообщение
str = new char[];
* * len = 0;
* * str[0] = '\0';
И такое компилируется? В любом случае это ошибка.
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
16.12.2012, 20:57  [ТС]     Перегрузка оператора #6
Лога не было, "просто" программа "подвисала" перед окончанием выполнения.

"Подкрутил-подмазал" и вот что получилось:

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
#include <iostream>;
#include <string.h>
#include <conio.h>
using namespace std;
 
class String
{
    char *str;
    int len;
public:
    String();
    String(char *s);
    //~String();
    String operator*(const String&);
    void Show();
};
String :: String ()
{
    str = new char[];
    len = 0;
}
 
String :: String (char *s)
{
    len = strlen(s);
    str = new char [/*len + 1*/];
    strcpy(str, s);
}
 
//String :: ~String()
//{
//  delete [] str;
//}
 
void String :: Show()
{
    for(int i = 0; i < len; ++i)
    {
        cout << str[i] << ' ';
    }
    cout << endl;
}
 
String String :: operator*(const String& obj)
{
    String temp;
 
    int meter = 0;
 
    for(int i = 0; i < len; ++i)
    {
        for(int j = 0; j < obj.len; ++j)
        {
            if(str[i] == obj.str[j])
            {
                temp.str[meter++] = str[i];
                break;
            }
        }
    }
 
    temp.len = meter;
    return temp;
}
 
int main(){
    
    String str1("abcdefj");
    str1.Show();
 
    String str2("defjhkl");
    str2.Show();
 
    String str3;
    str3 = str1 * str2;
    str3.Show();
 
    getch();
}
Подскажите, а деструктор здесь необходим?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2012, 20:58     Перегрузка оператора
Еще ссылки по теме:

C++ Перегрузка оператора ++
Перегрузка оператора *= C++
C++ Перегрузка оператора ++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
16.12.2012, 20:58     Перегрузка оператора #7
Цитата Сообщение от OdessaNA Посмотреть сообщение
str = new char[];
Не нужно так писать. Или
C++
1
2
str = new char[ 1 ];
str[ 0 ] = '\0';
или
C++
1
str = 0;
Yandex
Объявления
16.12.2012, 20:58     Перегрузка оператора
Ответ Создать тему
Опции темы

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