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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
#1

Переопределение оператора== - C++

31.07.2009, 08:01. Просмотров 1988. Ответов 23
Метки нет (Все метки)

Создал функцию-операцию == для экземпляров класса, однако при выполнении
данного кода
Trigger.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include "combinate.h"
 
class Trigger : public  Combinate
{
    static int *intValues;
public:
    int stateOutF;   //trigger forward
    int stateOutInv; //trigger invert
public:
    Trigger(void);
    Trigger(const Trigger &trig);
    bool SetValue(int number, int value);
    int GetState(size_t number);
    int GetState(size_t variant, size_t value);
    bool operator ==(const Trigger &trig);
    ~Trigger(void);
};
Trigger.cpp
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
...
int* Trigger::intValues=0;
 
Trigger::Trigger(void)
{
    stateOutF=1;
    stateOutInv=1;
    intValues=new int[input];
}
bool Trigger::SetValue(int number, int value)
{
    bool tr;
    if(number<=input && number>0)
    {
    intValues[number-1]=value;
    tr=true;
    }
    else
        tr=false;
    return tr;
}
bool Trigger::operator ==(const Trigger &trig)
{
    for(int i=0; i<input;)
    {
       if(intValues[i]==trig.intValues[i])
       {
           i++;
       }
       else 
       {
           return false;
       }
    }//for(int i=0; i<input; i++)
    return true;
 
}
Main.cpp
C++
1
2
3
4
Trigger trig;
Trigger trigd;
trig.SetValue(1, 45678);
bool dtr=(trig==trigd); //по идее не равны, однако выдает true
Функции-оператору ==почему-то в качестве параметра передается
объект с параметрами по умолчанию, хотя уже значение trig.intValues
уже изменилось
C++
1
trig.SetValue(1, 45678);
и объекты не могут быть равны, так как функция-операция
проверяет на равенство это поле.

Добавлено через 59 минут 24 секунды

Я понял в чем проблема оба объекта используют указатель на статическую переменную
intValues, расположенную в одной области памяти(, следовательно изменение значение
этого статического поля приводит к аналогичным изменениям у другого объекта и выходит, что оба объекта из-за моей функции-оператор== всегда равны(.
Можно ли как-нибудь обойти это ограничение, связанное со статическим полем?
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2009, 08:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переопределение оператора== (C++):

Переопределение оператора == - C++
Здравствуйте. Такая проблема: для поиска требуется сравнить два числа(в 1-ом случае инты, во 2-ом даблы). Для интов все отлично, а для...

Переопределение оператора ++ - C++
Необходимо переопределить оператор ++ в классе IteratorBase так, чтобы при этом вызывалась функция next(). template &lt;class T&gt; ...

Переопределение оператора - C++
У меня есть класс вектора. Надо переопределить оператор умножения числа на вектор. class myvector { private: int x,y,z; public:...

Переопределение оператора инкремента - C++
В теле класса &quot;Сlocks&quot; описали: Clocks&amp; operator ++(); // Prefix increment operator. Clocks operator ++(int); // Postfix...

Переопределение оператора в классе - C++
class String { char *mData; static const int c_size = 100; String(); String &amp; operator+=(const String &amp; s) { ...

Многоугольник. Переопределение оператора += - C++
Здравствуйте. Имеется класс Многоугольник. Преподаватель выдал доп.задания, одно из них переопределить += для добавления вершины (с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 09:53 #2
Цитата Сообщение от Skirmisher Посмотреть сообщение
bool operator ==(const Trigger &trig);
не хорошо. operator== лучше сделать другом. т.к. он не изменяет состояние объекта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct C {
  friend bool operator==(const C &lhs, const C &rhs);
 
  C() : data(0) { }
private:
  int data;
};
bool operator==(const C &lhs, const C &rhs) {
  return lhs.data == rhs.data;
}
bool operator!=(const C &lhs, const C &rhs) {
  return !(lhs == rhs);
}
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 11:47  [ТС] #3
Цитата Сообщение от zim22 Посмотреть сообщение
не хорошо. operator== лучше сделать другом. т.к. он не изменяет состояние объекта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct C {
  friend bool operator==(const C &lhs, const C &rhs);
 
  C() : data(0) { }
private:
  int data;
};
bool operator==(const C &lhs, const C &rhs) {
  return lhs.data == rhs.data;
}
bool operator!=(const C &lhs, const C &rhs) {
  return !(lhs == rhs);
}
Так тоже делал, однако проблема не в этом.
Проблема в том что используется указатель на статическую переменную и при изменении значения поля одного объекта у второго он тоже устанавливается к этому значению(делал отладку), поскольку используется одна область памяти.
Мне интересно, как-нибудь можно обойти это ограничение связанное с указателем на статическую переменную(глобальная переменная, доступная только в пределах класса). А то будет всегда возвращаться истинное значение функцией-оператором== (.
1
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
31.07.2009, 11:59 #4
Цитата Сообщение от Skirmisher Посмотреть сообщение
Проблема в том что используется указатель на статическую переменную и при изменении значения поля одного объекта у второго он тоже устанавливается к этому значению(делал отладку)
да ну? неужели?

Цитата Сообщение от Skirmisher Посмотреть сообщение
Мне интересно, как-нибудь можно обойти это ограничение связанное с указателем на статическую переменную(глобальная переменная, доступная только в пределах класса). А то будет всегда возвращаться истинное значение функцией-оператором== (.
ты сам ответил:
Цитата Сообщение от Skirmisher Посмотреть сообщение
используется одна область памяти.
а зачем тебе сравнивать статическое поле? это нонсенс.
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 12:03 #5
Цитата Сообщение от Skirmisher Посмотреть сообщение
Мне интересно, как-нибудь можно обойти это ограничение
удалить слово static.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 12:26  [ТС] #6
Цитата Сообщение от zim22 Посмотреть сообщение
удалить слово static.
Зачем тогда в задании нужен метод переопределяющий операцию==
для экземпляров класса, если в этом классе из полей есть только указатель на статическую переменную и состояния на прямом и нверсном выходах триггера. Выходит, что в функции операции надо сравнивать только эти значения, указатель на статическую переменную сравнивать бессмысленно.
Trigger.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include "combinate.h"
 
class Trigger : public  Combinate
{
        static int *intValues;
public:
        int stateOutF;   //trigger forward
        int stateOutInv; //trigger invert
public:
        Trigger(void);
        Trigger(const Trigger &trig);
        bool SetValue(int number, int value);
        int GetState(size_t number);
        int GetState(size_t variant, size_t value);
        friend bool operator ==(const Trigger &trig1, const Trigger &trig2);
        ~Trigger(void);
};
Trigger.cpp
C++
1
2
3
4
5
...
bool Trigger::operator ==(const Trigger &trig1, const Trigger &trig2)
{
 return ( (trig1.stateOutF)&&(trig1.stateOutInv)==(trig2.stateOutF)&&(trig2.stateOutInv) );
}
А есть ли какая-нибудь операция вида const_cast(для удаления модификатора const), только для удаления модификатора static?
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 12:33 #7
Цитата Сообщение от Skirmisher Посмотреть сообщение
Выходит, что в функции операции надо сравнивать только эти значения, указатель на статическую переменную сравнивать бессмысленно.
да
Цитата Сообщение от Skirmisher Посмотреть сообщение
А есть ли какая-нибудь операция вида const_cast(для удаления модификатора const), только для удаления модификатора static?
нету
Цитата Сообщение от Skirmisher Посмотреть сообщение
bool operator ==(const Trigger &trig);
Цитата Сообщение от Skirmisher Посмотреть сообщение
bool Trigger::operator ==(const Trigger &trig1, const Trigger &trig2)
ну и как? компилится?
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 12:38  [ТС] #8
Цитата Сообщение от zim22 Посмотреть сообщение
да
ну и как? компилится?
Да компилируется и нормально.
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 12:48 #9
Цитата Сообщение от Skirmisher Посмотреть сообщение
Да компилируется и нормально.
давайте поспорим, что оно не компилируется? желательно на деньги.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 13:59  [ТС] #10
Цитата Сообщение от zim22 Посмотреть сообщение
давайте поспорим, что оно не компилируется?
Trigger.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "combinate.h"
 
class Trigger : public  Combinate
{
public:
    static int *intValues;
public:
    int stateOutF;   //trigger forward
    int stateOutInv; //trigger invert
public:
    Trigger(void);
    Trigger(const Trigger &trig);
    bool SetValue(int number, int value);
    int GetState(size_t number);
    int GetState(size_t variant, size_t value);
    bool operator ==(const Trigger &trig);
    //friend bool operator ==(const Trigger &trig1, const Trigger &trig2);
    ~Trigger(void);
};
Trigger.cpp
C++
1
2
3
4
bool Trigger::operator ==(const Trigger &trig)
{
return (((this->stateOutF)==(trig.stateOutF))&&((this->stateOutInv)==(trig.stateOutInv)));
}
В другом случае( с friend operator)
Trigger.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "combinate.h"
 
class Trigger : public  Combinate
{
public:
    static int *intValues;
public:
    int stateOutF;   //trigger forward
    int stateOutInv; //trigger invert
public:
    Trigger(void);
    Trigger(const Trigger &trig);
    bool SetValue(int number, int value);
    int GetState(size_t number);
    int GetState(size_t variant, size_t value);
    //bool operator ==(const Trigger &trig);
    friend bool operator ==(const Trigger &trig1, const Trigger &trig2);
    ~Trigger(void);
};
Trigger.cpp
C++
1
2
3
4
bool operator ==(const Trigger &trig1, const Trigger &trig2)
{
return ( ((trig1.stateOutF)==(trig2.stateOutF))&&((trig1.stateOutInv)==(trig2.stateOutInv)) );
}
В том и другом случае компилируется и собирается нормально.
1
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
31.07.2009, 14:11 #11
Skirmisher, operator == это не "метод переопределяющий операцию ==", а перегрузка оператора сравнения. Так, для информации
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 14:17  [ТС] #12
Цитата Сообщение от M128K145 Посмотреть сообщение
Skirmisher, operator == это не "метод переопределяющий операцию ==", а перегрузка оператора сравнения. Так, для информации
Так эту информацию я не от себя взял, а из учебника все той же Павловской, там в заданий сказано, что в классе должны содержаться следующие методы:
...
* метод, переопределяющий операцию == для экземпляров класса.
Так что, если это определение неверно, то оно не мое, а Павловской!
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 14:33 #13
Цитата Сообщение от Skirmisher Посмотреть сообщение
Так что, если это определение неверно, то оно не мое, а Павловской!
это ваша учительница по информатике? конечно она во всём виновата.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 14:37  [ТС] #14
Цитата Сообщение от zim22 Посмотреть сообщение
это ваша учительница по информатике? конечно она во всём виновата.
Нет книгу по информатике для вузов написала называется.
С++. Программирование на языке высшего уровня.
Определения я оттуда беру. Ну что скомпилировал, как у меня показано выше?
У меня все нормально компилируется.
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
31.07.2009, 14:38 #15
zim22, Татьяна Александровна Павловская профессор кафедры информатики и прикладной математики Санкт-Петербургского государственного университета информационных технологий, механики и оптики (СПбГУИТМО), кандидат технических наук в области систем автоматизации проектирования. Автор книги "C/C++. Программирование на языке высокого уровня" по которой учится Skirmisher
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2009, 14:38
Привет! Вот еще темы с ответами:

Переопределение оператора присваивания - C++
Имеется такой простой класс: class TClass { private: float* A; int N; public: TClass(int _N) ...

Переопределение оператора ввода - C++
struct info { int num; string kuda; string type; double cena; int count; }; ifstream &amp;operator &gt;&gt;(ifstream &amp;inp, info...

Переопределение оператора <<, класса ofstream - C++
#ifndef COUT_RUS_H #define COUT_RUS_H #include &lt;iostream&gt; #include &lt;windows.h&gt; namespace rus { class Ccout { ...

Переопределение оператора () для своего класса - C++
У меня вопрос. Как переопределить оператор () для своего класса?Если можно,приведите пример.


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

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

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