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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Alucard12r
Сообщений: n/a
#1

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

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

Описал первый класс,затем - описал второй класс, используя первый,и когда начал перезагружать оператор для второго класса, вылезла ошибка.Выделена синим цветом в самом низу кода.
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;
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2009, 20:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса (C++):

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

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

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

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

Ошибка в перегрузке операторов для класса - итератора - C++
Добрый вечер. Есть заготовка программы для работы с матрицей, построенной из узлов с четырьмя связями (вверх, вниз, влево, вправо)....

При описании класса String компилятор выдает непонятные сообщения об ошибках - C++
#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class String{ public: String(); String(const char *const); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
24.07.2009, 20:48 #2
ошибка во время выполнения программы, или во время компилирования?
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 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;
Monte-Cristo
24.07.2009, 21:59
  #4

Не по теме:

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

ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
24.07.2009, 22:04 #5
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ISergey, и не влом же тебе анализировать код было
да это просто так.. случайно заметил..
тут в коде ошибок хватает.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
24.07.2009, 22:12 #6
у меня все пашет нормально..... в конце добавил
C++
1
2
3
4
5
int main(){
 
 
getchar();
}
и все.....никаких ошибок
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
24.07.2009, 22:22 #7
@lex, ошибки не в синтаксисе, а в логики. Смотри на пост ISergey.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
24.07.2009, 22:23 #8
Цитата Сообщение от @lex Посмотреть сообщение
и все.....никаких ошибок
синтаксических нет, а от логических..
Alucard12r
Сообщений: n/a
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. сравнение двух треугольников недописано,но это несущественно, пока не узнаю, как быть с ошибкой - смысла дописывать нет никакого
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
25.07.2009, 02:34 #10
Цитата Сообщение от Alucard12r Посмотреть сообщение
P.S. сравнение двух треугольников недописано,но это несущественно, пока не узнаю, как быть с ошибкой - смысла дописывать нет никакого
Смотри мой первый пост.. я вроде показал причину ошибки.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
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;
    }
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2009, 03:01
Привет! Вот еще темы с ответами:

Ошибка при перегрузке оператора, не знаю как исправить - C++
#pragma once #include &lt;iostream&gt; #include &lt;vector&gt; #define innerVectorType std::vector&lt;T&gt; template &lt;class T&gt; class Matrix ...

Какими способами можно использовать функции класса B, как параметры функции Sub класса А? - C++
class A {... void Sub(...); ...} class B : ... { public: float f1(float); float f2(float); ...

Не получается использовать итераторы вектора в качестве итераторов своего класса - C++
Пишу класс матрицы, основанный на векторе. Хочу его сделать stl-совместимым. Т.к. класс основан на векторе, решил возвращать итераторы...

Почему после конструктора первого класса стоит двоеточие и имя переменной, а не инициализация? - C++
#include &lt;iostream&gt; template &lt;typename T&gt; class first { public: T value; first (T n) : value(n) {} virtual...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.07.2009, 03:01
Ответ Создать тему
Опции темы

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