Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Alucard12r
1

При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса

24.07.2009, 20:40. Показов 1389. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Описал первый класс,затем - описал второй класс, используя первый,и когда начал перезагружать оператор для второго класса, вылезла ошибка.Выделена синим цветом в самом низу кода.
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "windows.h"
#include "malloc.h"
using namespace std;
 
class vektor
{
public:
    float x;
    float y;
    double lenght()
    {
        double l;
        l = sqrt(x * x + y * y);
        return l;
    }
    vektor operator+ (vektor thevektor)
    {
        vektor summarn;
        summarn.x = x + thevektor.x;
        summarn.y = y + thevektor.y;
        return summarn;
    }
    vektor operator- (vektor thevektor)
    {
        vektor raznost;
        raznost.x = x - thevektor.x;
        raznost.y = y - thevektor.y;
        return raznost;
    }
    float operator* (vektor thevektor)
    {
        float skalar;
        skalar = x * thevektor.x + y * thevektor.y;
        return skalar;
    }
    bool operator|| (vektor thevektor)
    {
        float cosin;
        cosin = sqrt((x * x + y * y)*(thevektor.x * thevektor.x + thevektor.y * thevektor.y));
        if (cosin == 0) return true;
        cosin = (x * thevektor.x + y * thevektor.y)/cosin;
        if ((cosin == 1)||(cosin == -1)) return true;
        return false;
    }
    vektor operator! ()
    {
        vektor negative;
        negative.x = -x;
        negative.y = -y;
        return negative;
    }
    bool operator== (vektor thevektor)
    {
        if (x != thevektor.x) return false;
        if (y != thevektor.y) return false;
        return true;
    }
    bool operator!= (vektor thevektor)
    {
        if (x != thevektor.x) return true;
        if (y != thevektor.y) return true;
        return false;
    }
    bool operator&& (vektor thevektor)
    {
        float cosin;
        cosin = sqrt((x * x + y * y)*(thevektor.x * thevektor.x + thevektor.y * thevektor.y));
        if (cosin == 0) return false;
        cosin = (x * thevektor.x + y * thevektor.y)/cosin;
        if ((cosin == 1)||(cosin == -1)) return false;
        return true;
    }
};
 
class treugolnik
{
public:
    vektor B;
    vektor C;
    double square()
    {
        double sqroftrg;
        sqroftrg = 0.5 * sqrt((B.x * B.x * C.y * C.y) + (C.x * C.x * B.y * B.y) - (2 * B.x * C.x * B.y * C.y));
        return sqroftrg;
    }
    bool make(vektor vB,vektor vC)
    {
        if (vB||vC) return false;
        B = vB;
        C = vC;
        return true;
    }
    bool operator== (treugolnik Trrr)
    {
        double Check[1][2];
        int i;
        for (i = 0; i < 3; ++i) Check[0][i] = 0;
        for (i = 0; i < 3; ++i) Check[0][i] = 0;
        vektor D,E;
        D = Trrr.B - Trrr.C;
        E = B - C;
/* вот на этой строке вылетает.
Меняя местами, пытаясь извлекать вместо всего вектора B его часть B.x ,
установил,что не может извлечь ничего из "B" и "C"
вопрос,как задать вектора "B" и "C" в составе первого операнда (тип Treugolnik),
 прямо написать их имена так же,как в описании класса,
получается с любым стандартным типом переменной 
и не получается с другим классом*/
        Check[0][0] = B.lenght();
        Check[0][1] = C.lenght();
        Check[0][2] = E.lenght();
        Check[1][0] = Trrr.B.lenght();
        Check[1][1] = Trrr.C.lenght();
        Check[1][2] = D.lenght();
        return true;
    }
};
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2009, 20:40
Ответы с готовыми решениями:

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются классы class new1{...

Не использовать имя класса при его реализации
Из-за того, что не смог грамотно сформулировать свой вопрос, не нашел ничего в гугле :( Поэтому...

Возможно ли как-то, зная имя класса, вернуть в каком-либо методе имя класса?
Добрый день! Интересуюсь. Есть Обобщенный метод, например: Add&lt;T&gt;(string nameElement). ...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на...

11
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
24.07.2009, 20:48 2
ошибка во время выполнения программы, или во время компилирования?
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
24.07.2009, 21:54 3
Код
Check[0][0] = B.lenght();
Check[0][1] = C.lenght();
Check[0][[COLOR="Red"]2[/COLOR]] = E.lenght();
Check[[COLOR="#ff0000"]1[/COLOR]][0] = Trrr.B.lenght();
Check[[COLOR="#ff0000"]1[/COLOR]][[COLOR="#ff0000"]1[/COLOR]] = Trrr.C.lenght();
Check[[COLOR="#ff0000"]1[/COLOR]][[COLOR="#ff0000"]2[/COLOR]] = D.lenght();
Здесь выход за границы массива double Check[1][2];

Добавлено через 54 секунды
здесь тоже
Код
for (i = 0; i < [COLOR="Red"]3[/COLOR]; ++i) Check[0][i] = 0;
for (i = 0; i < [COLOR="#ff0000"]3[/COLOR]; ++i) Check[0][i] = 0;
1
Monte-Cristo
24.07.2009, 21:59
  #4

Не по теме:

ISergey, и не влом же тебе анализировать код было =-O

0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
24.07.2009, 22:04 5
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ISergey, и не влом же тебе анализировать код было
да это просто так.. случайно заметил..
тут в коде ошибок хватает.
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
24.07.2009, 22:12 6
у меня все пашет нормально..... в конце добавил
C++
1
2
3
4
5
int main(){
 
 
getchar();
}
и все.....никаких ошибок
0
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
24.07.2009, 22:22 7
@lex, ошибки не в синтаксисе, а в логики. Смотри на пост ISergey.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
24.07.2009, 22:23 8
Цитата Сообщение от @lex Посмотреть сообщение
и все.....никаких ошибок
синтаксических нет, а от логических..
0
Alucard12r
24.07.2009, 22:34 9
Прошу прощения,что не добавил сразу... Использовал Visual Studio 6.0 если что. Так вот, то,что привел я-это содержимое header-файла, main выглядела так:
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
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "windows.h"
#include "malloc.h"
#include "myvektor.h"
using namespace std;
 
int main()
{
    treugolnik Treug,Dreug;
    vektor first,second,third,fourth;
    double iskomoe;
    bool reality;
    first.x = 2.0;
    first.y = 2.0;
    second.x = -2.0;
    second.y = 2.0;
    reality = Treug.make(first,second);
    if (reality)
    {
        cout << "All right :-)\n";
    }
    iskomoe = Treug.square();
    cout << iskomoe << "\n";
    third.x = 3.0;
    third.y = 3.0;
    fourth.x = 3.0;
    fourth.y = 3.0;
    reality = Dreug.make(third,fourth);
    if (reality)
    {
        cout << "ok\n";
    }
/* вот тут при исполнении кода вылетало с ошибкой,
в отладке как раз и показало,что не может извлечь 
значения из B и C там,где задается оператор ==  
менял местами некоторые комманды и пробовал вместо
оператора вычитания "B - C" расписать получение того же значения.
Все та же ошибка- не может считать данных с переменных B и C
при этом " D = Trrr.B - Trrr.C" работало нормально для второго аргумента,
но для первого нельзя (или я не знаю как) задать название объекта класса "treugolnik",
 из которого будут браться vektor's B и C,можно только прямо указать эти буквы.
такой вариант прокатывает для стандартных типов,но не прокатывает для классов
просьба как раз помочь с этим :))
*/
    if (Treug == Dreug)
    {
        cout << "triangles are equal\n";
    }
    if (third == fourth)
    {
        cout << "all right again :-)\n";
    }
    first = third - fourth;
    return 0;
}
P.S. сравнение двух треугольников недописано,но это несущественно, пока не узнаю, как быть с ошибкой - смысла дописывать нет никакого
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
25.07.2009, 02:34 10
Цитата Сообщение от Alucard12r Посмотреть сообщение
P.S. сравнение двух треугольников недописано,но это несущественно, пока не узнаю, как быть с ошибкой - смысла дописывать нет никакого
Смотри мой первый пост.. я вроде показал причину ошибки.
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
25.07.2009, 02:49 11
У меня вопрос.
Когда перегружается оператор
C++
1
2
3
4
5
6
7
    vektor operator- (vektor thevektor)
    {
        vektor raznost;
        raznost.x = x - thevektor.x;
        raznost.y = y - thevektor.y;
        return raznost;
    }
То этот оператор возвращает какой-то временный объект.Это правильно ? Разве не нужно возвращать *this? Навроде
C++
1
2
3
4
5
6
    vektor operator- (const vektor &thevektor)
    {
        x = x - thevektor.x;
        y = y - thevektor.y;
        return *this;
    }
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
25.07.2009, 03:01 12
В даном случаи нужно какраз возвращать временный..
вот пример
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
#include <iostream>
 
class Employee{
public:
    Employee(int _x = 0): x(_x){}
    Employee(const Employee &rhs){
        *this = rhs;
    }
    Employee &operator = (const Employee &rhs){
        this->x = rhs.x;
        return *this;
    }
    Employee operator - (const Employee &rhs){
        Employee temp(*this);
        temp.x -= rhs.x;
        return temp;
    }
 
    void print(){
        std::cout << "Employee::x = " << x << '\n';
    }
private:
    int x;
};
 
class Employee2{
public:
    Employee2(int _x = 0): x(_x){}
    Employee2(const Employee2 &rhs){
        *this = rhs;
    }
    Employee2 &operator = (const Employee2 &rhs){
        this->x = rhs.x;
        return *this;
    }
    Employee2 operator - (const Employee2 &rhs){
        this->x -= rhs.x;
        return *this;
    }
 
    void print(){
        std::cout << "Employee::x = " << x << '\n';
    }
private:
    int x;
};
 
int main()
{
    Employee e1(2), e2(1);
    e1 - e2;
    e1.print();
 
 
    Employee2 e12(2), e22(1);
    e12 - e22; //bug e12 is modify 
    e12.print();
    return 0;
}
1
25.07.2009, 03:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2009, 03:01
Помогаю со студенческими работами здесь

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса...

Как использовать имя класса, переданное в виде строки
Задание: Не прошу его решать за меня. Просто мне непонятно, зачем хранить соответствие между...

Разъясните синтаксис - имя класса при передаче аргументов методу класса
Здравствуйте. Несколько раз столкнулся с нижеследующим кодом классов. 1. При разборе роутера...

Можно ли объявлять в описании одного класса объекты другого класса
Здравствуйте! Помогите, пожалуйста, разобраться: я описал класс SignalZakon, а теперь хочу создать...

Объявление объекта одного класса в описании другого класса
Здравствуйте. Почему при объявлении Student s в классе Teacher не возникает ошибки? Ведь такой...

Ошибка при попытке использовать объект класса в определении другого класса
Муторное название получилось :scratch: Прошу помощи.... есть созданный класс работы со строкой:...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru