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

Классы и методы, перегрузка операторов == и != - C++

Восстановить пароль Регистрация
 
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 18:31     Классы и методы, перегрузка операторов == и != #1
не могу разобраться с перегрузкой операторов == или != для 2 массивов типа char и int состоящих из 5 элементов.
при составлении кода пишет что невозможно преобразовать из int to stip/char to stip.
stip - имя класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class stip
{
char reszac[5];
int resex[5];
stip operator!=(stip obj);
stip operator==(stip obj);
};
--//--
stip stip::operator!=(stip obj)
{
 return stip(resex[5],reszac[5]);
}
stip stip::operator==(stip obj)
{
 return stip(resex[5],reszac[5]);
}
вот моя попытка перегрузки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 19:41     Классы и методы, перегрузка операторов == и != #2
Цитата Сообщение от SK01736 Посмотреть сообщение
return stip(resex[5],reszac[5]);
Что это вы такое интересное пытаетесь сделать?
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 19:44  [ТС]     Классы и методы, перегрузка операторов == и != #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что это вы такое интересное пытаетесь сделать?
мне нужно что бы в if было условие проверки, без перегрузки не пашет, а если пустое сделать пишет нет оператора != для соответствующего операнда.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 19:54     Классы и методы, перегрузка операторов == и != #4
SK01736, это я понимаю. Я спрашиваю, что вы пытаетесь сделать в процитированной мной строке кода. Начать хотя бы с того, что для поставленной вами задачи оператор сравнение на равенство (неравенство) должен возвращать значение типа bool или типа, который может быть приведён к bool (прямо или косвенно).
Вам нужно просто поэлементно сравнить массивы?
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 19:57  [ТС]     Классы и методы, перегрузка операторов == и != #5
мне нужно сравнить 1 массив на наличие 2 или 1, а 2 массив на наличие "незачет".
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 20:01     Классы и методы, перегрузка операторов == и != #6
SK01736, хорошо, это определили. Далее, какой смысл вы заложили в эту строку:
Цитата Сообщение от SK01736 Посмотреть сообщение
return stip(resex[5],reszac[5]);
? Не вижу здесь ни проверки на 2 или 1, ни проверки на "незачёт".
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 20:02  [ТС]     Классы и методы, перегрузка операторов == и != #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
SK01736, хорошо, это определили. Далее, какой смысл вы заложили в эту строку:

? Не вижу здесь ни проверки на 2 или 1, ни проверки на "незачёт".
проверка идет внутри функции, Я не совсем понимаю к чему вы клонете.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 20:05     Классы и методы, перегрузка операторов == и != #8
SK01736, я клоню к тому, что для того, чтобы означенные проверки состоялись, их надо реализовать вручную. Вы же пока в строке
C++
1
return stip(resex[5],reszac[5]);
пытаетесь вернуть объект типа stip, сконструированный при помощи конструктора
C++
1
stip::stip(int, char);
, которого я в коде не вижу, да к тому же выходите за границы своих массивов (в которых индекс последнего элемента - 4).
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 20:08  [ТС]     Классы и методы, перегрузка операторов == и != #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
SK01736, я клоню к тому, что для того, чтобы означенные проверки состоялись, их надо реализовать вручную. Вы же пока в строке
C++
1
return stip(resex[5],reszac[5]);
пытаетесь вернуть объект типа stip, сконструированный при помощи конструктора
C++
1
stip::stip(int, char);
, которого я в коде не вижу, да к тому же выходите за границы своих массивов (в которых индекс последнего элемента - 4).
C++
1
2
3
4
5
bool stip::operator!=(stip obj)
{
    for(int i=0;i<5;i++)
 return bool(resex[i]!=1||resex[i]!=2||reszac[i]="незачет");
}
может как-то это изменить что бы было нормально?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 20:16     Классы и методы, перегрузка операторов == и != #10
Стоп, для начала давайте ещё вот с чем определимся. С какого перепугу оператор сравнения на равенство проверяет какие-то условия в объекте, не затрагивая свой второй операнд? Оператор сравнения должен сравнивать, если он выполняет другую работу - это говорит о плохом понимании смысла перегрузки операторов. В вашем случае надо написать метод класса, проверяющий необходимые условия. Он будет выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
bool stip::check() const
{
    if (strcmp(reszac, "nz"))
        return false;
    
    for (size_t i = 0; i < 5; ++i)
        if (resex[i] == 1 || resex[i] == 2)
            return false;
    
    return true;
}
Учитываем, что для strcmp надо подключить cstring, а также то, что слово "незачёт" в массиве из 5 символов не поместится, а поместится в массиве как минимум из 8 символов (7 под слово, один под нуль-терминатор), а также возможные проблемы с локалью (русский язык).
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 20:28  [ТС]     Классы и методы, перегрузка операторов == и != #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Стоп, для начала давайте ещё вот с чем определимся. С какого перепугу оператор сравнения на равенство проверяет какие-то условия в объекте, не затрагивая свой второй операнд? Оператор сравнения должен сравнивать, если он выполняет другую работу - это говорит о плохом понимании смысла перегрузки операторов. В вашем случае надо написать метод класса, проверяющий необходимые условия. Он будет выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
bool stip::check() const
{
    if (strcmp(reszac, "nz"))
        return false;
    
    for (size_t i = 0; i < 5; ++i)
        if (resex[i] == 1 || resex[i] == 2)
            return false;
    
    return true;
}
Учитываем, что для strcmp надо подключить cstring, а также то, что слово "незачёт" в массиве из 5 символов не поместится, а поместится в массиве как минимум из 8 символов (7 под слово, один под нуль-терминатор), а также возможные проблемы с локалью (русский язык).
может скинуть весь код с заданием, а ты мне скажешь где что преобразовать, что бы было правильно?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 20:34     Классы и методы, перегрузка операторов == и != #12
SK01736, выкладывайте.
SK01736
3 / 3 / 1
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 20:36  [ТС]     Классы и методы, перегрузка операторов == и != #13
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
94
95
96
// lab.k.kurs.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <locale.h>
#include <fstream>
#include <conio.h>
#include <iostream>
#define n 5
using namespace std;
class stip
{
public:
int sum;
char LName[5];
int resex[5];
char reszac[5];
static void stipendiya(stip resex[5],stip reszac[5],stip LName[5]);
stip operator+(stip obj);
bool operator!=(stip obj);
friend ostream& operator<<(ostream &stream,const stip &obj);
friend istream& operator>>(istream &stream,stip &obj);
};
int main()
{
    ifstream f;
f.open("aaa.txt");
setlocale(LC_ALL, "Russian");
    stip LName[25],resex[5],reszac[5];
for(int i=0;i<5;i++)
{
    f.seekg(f.tellg());
    f>>LName[i];
    cout<<LName[i]<<" ";
    for(int j=0;j<5;j++)
    {
    f.seekg(f.tellg());
    f>>resex[j];
    cout<<resex[j]<<" ";
    }
    for(int j=0;j<5;j++)
    {
    f.seekg(f.tellg());
    f>>reszac[j];
    cout<<reszac[j]<<" ";
    }
    cout<<endl;
//  stipendiya();
}
return 0;
}
 
stip stip::operator+(stip obj)
{
 return stip();
}
bool stip::operator!=(stip obj)
{
    for(int i=0;i<5;i++)
 return bool(resex[i]!=1||resex[i]!=2||reszac[i]="незачет");
}
void stip::stipendiya(stip resex[5],stip reszac[5],stip LName[5])
{
    stip sum;
    char *zac="незачет";
    int n1[5],n2[5];
    for(int i=0;i<5;i++)
    {
        if(resex[i]!=1||resex[i]!=2)
        {
        n1[i]=1;
        }
        else
        n1[i]=0;
        if(reszac[i]!=zac)
        n2[i]=0;
        else
        n2[i]=1;
        sum=sum+resex[i];
    if(n1[i]==1||n2[i]==1)
        cout<<"Стипендии не будет!"<<endl;
    else if(sum/5>=4) cout<<"Стипендия будет! Средний бал составляет "<<sum/5<<endl;
    }
            
}
ostream& operator<<(ostream &stream,const stip &obj)
 {
     stream<<obj.LName<<noshowpos;
 return stream;
 }
//-----------------------
istream& operator>>(istream &stream,stip &obj)
 {
     stream>>obj.LName;
 return stream;
 }
В файле ведомость группы , в каждой строке задается : Фамилия студента, пять полей с результатами экзаменов, пять полей с результатами зачетов (если не сдан экзамен , то 2; если не сдан зачет, то незачет). Разработать класс для решения задачи зачисления стипендии по итогам сессии.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 20:45     Классы и методы, перегрузка операторов == и !=
Еще ссылки по теме:

C++ Классы. Перегрузка операторов для комплексного числа
C++ Перегрузка операторов
ООП классы, перегрузка операторов C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.05.2012, 20:45     Классы и методы, перегрузка операторов == и != #14
SK01736, мда... Честно говоря, код легче полностью переписать заново, чем что-то менять. Вернее, тут надо менять процентов 95 кода. Мне этим, если честно, заниматься неохота, так что либо пытайтесь интегрировать то, о чём я уже сказал, в код, либо ждите того, кто вам напишет правильный вариант.
Yandex
Объявления
15.05.2012, 20:45     Классы и методы, перегрузка операторов == и !=
Ответ Создать тему
Опции темы

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