Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 2
Регистрация: 21.01.2011
Сообщений: 29
1

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

15.05.2012, 18:31. Просмотров 1314. Ответов 13
Метки нет (Все метки)

не могу разобраться с перегрузкой операторов == или != для 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]);
}
вот моя попытка перегрузки
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2012, 18:31
Ответы с готовыми решениями:

Классы: перегрузка операторов
Добрый день. Есть задание - Определить класс «матрица». Определить операции над матрицами :...

Оператор суммирования (классы, перегрузка операторов)
#include <iostream> class mat { public: mat() { var = 0; } mat(int a) { var = a; } ~mat()...

Классы. Перегрузка операторов для комплексного числа
На основе вот этой темы: https://www.cyberforum.ru/cpp-beginners/thread1010206.html (к сожалению...

Классы, матрицы, перегрузка операторов, дружественные функции
Гляньте пожалуйста, как получилось сделать задание, что неверно: Создать класс, в котором...

13
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
15.05.2012, 19:41 2
Цитата Сообщение от SK01736 Посмотреть сообщение
return stip(resex[5],reszac[5]);
Что это вы такое интересное пытаетесь сделать?
0
3 / 3 / 2
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 19:44  [ТС] 3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что это вы такое интересное пытаетесь сделать?
мне нужно что бы в if было условие проверки, без перегрузки не пашет, а если пустое сделать пишет нет оператора != для соответствующего операнда.
0
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
15.05.2012, 19:54 4
SK01736, это я понимаю. Я спрашиваю, что вы пытаетесь сделать в процитированной мной строке кода. Начать хотя бы с того, что для поставленной вами задачи оператор сравнение на равенство (неравенство) должен возвращать значение типа bool или типа, который может быть приведён к bool (прямо или косвенно).
Вам нужно просто поэлементно сравнить массивы?
0
3 / 3 / 2
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 19:57  [ТС] 5
мне нужно сравнить 1 массив на наличие 2 или 1, а 2 массив на наличие "незачет".
0
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
15.05.2012, 20:01 6
SK01736, хорошо, это определили. Далее, какой смысл вы заложили в эту строку:
Цитата Сообщение от SK01736 Посмотреть сообщение
return stip(resex[5],reszac[5]);
? Не вижу здесь ни проверки на 2 или 1, ни проверки на "незачёт".
0
3 / 3 / 2
Регистрация: 21.01.2011
Сообщений: 29
15.05.2012, 20:02  [ТС] 7
Цитата Сообщение от silent_1991 Посмотреть сообщение
SK01736, хорошо, это определили. Далее, какой смысл вы заложили в эту строку:

? Не вижу здесь ни проверки на 2 или 1, ни проверки на "незачёт".
проверка идет внутри функции, Я не совсем понимаю к чему вы клонете.
0
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
15.05.2012, 20:05 8
SK01736, я клоню к тому, что для того, чтобы означенные проверки состоялись, их надо реализовать вручную. Вы же пока в строке
C++
1
return stip(resex[5],reszac[5]);
пытаетесь вернуть объект типа stip, сконструированный при помощи конструктора
C++
1
stip::stip(int, char);
, которого я в коде не вижу, да к тому же выходите за границы своих массивов (в которых индекс последнего элемента - 4).
0
3 / 3 / 2
Регистрация: 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]="незачет");
}
может как-то это изменить что бы было нормально?
0
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
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 под слово, один под нуль-терминатор), а также возможные проблемы с локалью (русский язык).
0
3 / 3 / 2
Регистрация: 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 под слово, один под нуль-терминатор), а также возможные проблемы с локалью (русский язык).
может скинуть весь код с заданием, а ты мне скажешь где что преобразовать, что бы было правильно?
0
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
15.05.2012, 20:34 12
SK01736, выкладывайте.
0
3 / 3 / 2
Регистрация: 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; если не сдан зачет, то незачет). Разработать класс для решения задачи зачисления стипендии по итогам сессии.
0
Эксперт С++
5041 / 3102 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
15.05.2012, 20:45 14
SK01736, мда... Честно говоря, код легче полностью переписать заново, чем что-то менять. Вернее, тут надо менять процентов 95 кода. Мне этим, если честно, заниматься неохота, так что либо пытайтесь интегрировать то, о чём я уже сказал, в код, либо ждите того, кто вам напишет правильный вариант.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 20:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нужен код, в котором есть: Классы, Наследование, Виртуальная функция, Перегрузка операторов
Скоро сдавать лабораторные работы, помогите пожалуйста)) Если можете, пришлите код, в котором есть:...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…)....

Перегрузка операторов
Помогите разобраться в перегрузке операторов. Нужно создать клас Автомобиль в котором определить...


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

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

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