С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

31.07.2009, 08:01. Просмотров 2052. Ответов 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++
Здравствуйте. Имеется класс Многоугольник. Преподаватель выдал доп.задания, одно из них переопределить += для добавления вершины (с...

23
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
31.07.2009, 14:41 #16
Цитата Сообщение от Skirmisher Посмотреть сообщение
Так что, если это определение неверно, то оно не мое, а Павловской!
выбрось ты этот учебник.. у меня друг по нему же занимался, так я его на Шилдта веревел. Если ООП учишь, то уже лучше, имхо, учи по Р.Лафоре "Объектно-ориентированное программирвоание в C++" (это из серии Классика Computer Science)
1
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
31.07.2009, 14:43 #17
Skirmisher, да кстати, если хочешь понять эту книгу, то приведи в рабочее состояние тот макрос на 3 страницы для работы с русским языком
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 14:47 #18
Цитата Сообщение от Skirmisher Посмотреть сообщение
Ну что скомпилировал, как у меня показано выше?
У меня все нормально компилируется.
вы лукавите. код, на который я вам указывал - не компилируется.
но код, который вы позднее привели - компилируется. т.к. он исправленный
***
не люблю я русских авторов книг по С++. ну не верю я им
почитайте Липпмана. Язык программирования С++. Вводный курс. 4 издание.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 14:52  [ТС] #19
Цитата Сообщение от M128K145 Посмотреть сообщение
Skirmisher, да кстати, если хочешь понять эту книгу, то приведи в рабочее состояние тот макрос на 3 странице для работы с русским языком
Что ты имеешь ввиду описать функцию вида в одном из методов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "windows.h"
#include <iostream>
 
using namespace std;
 
char bufRus[256]; //100h
 
char* Rus(LPCWSTR text);
 
int main()
{
   cout<<Rus(L"Макрос на 3 странице для работы с русским языком")<<endl;
}
 
char* Rus(LPCWSTR text)
{
    CharToOem(text, bufRus);
    return bufRus;
}
Добавлено через 2 минуты 16 секунд
Цитата Сообщение от zim22 Посмотреть сообщение
вы лукавите. код, на который я вам указывал - не компилируется.
но код, который вы позднее привели - компилируется. т.к. он исправленный
***
не люблю я русских авторов книг по С++. ну не верю я им
почитайте Липпмана. Язык программирования С++. Вводный курс. 4 издание.
Значит где-то я опечатался потому что в моем проекте все нормально скомпилировано,
собрано и отлажено. Хотя некоторые методы не до конца отлажены(.
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
31.07.2009, 15:05 #20
а нет извини, это в другой книге Павловской "С++ и ООП Практикум" на стр 159 увидиш.
0
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
31.07.2009, 15:06  [ТС] #21
Цитата Сообщение от M128K145 Посмотреть сообщение
а нет извини, это в другой книге Павловской "С++ и ООП Практикум" на стр 159 увидиш.
У меня такой книги нет, дай ссылку пожалуйста.
0
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
31.07.2009, 16:27 #22
Цитата Сообщение от zim22 Посмотреть сообщение
не хорошо. operator== лучше сделать другом. т.к. он не изменяет состояние объекта.
%) Срыв крыши. Почему лучше другом?

Сравнивать, естественно, нужно уникальные для класа переменные - int stateOutF; и int stateOutInv;

А вот сигнатуру ф-ции поправить бы не мешало.

C++
1
2
3
4
5
class Trigger : public  Combinate
{
   ...
   bool operator ==(const Trigger &trig) const;
   ...
ну и для GetState так же.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
31.07.2009, 16:46 #23
Цитата Сообщение от Alexandoros Посмотреть сообщение
%) Срыв крыши. Почему лучше другом?
Так в книжечке написано:
Симметричные операторы, такие как арифметические, операторы равенства, реляционные и побитовые, лучше определять, как обычные функции, не члены класса.
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
31.07.2009, 16:49 #24
Skirmisher, вот линк С++ и ООП Практикум

содержимое ссылки проверил
1
31.07.2009, 16:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2009, 16:49
Привет! Вот еще темы с ответами:

Переопределение оператора присваивания - 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++
У меня вопрос. Как переопределить оператор () для своего класса?Если можно,приведите пример.


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

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

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