!= WTF!

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

17 окт 2007, 22:57

В общих словах...
Создал свой класс data (туда забивается дата).
Определил для нее оператор сравнения как друга
friend bool operator != (data x1, datax2);
Ну и по членно сравнивал значения все работало.
Сам оператор писался для следующего ифа:
if(x1+37!=cur)
{}
где x1 и cur типа data (мой собственный класс).
(Оператор сложения data с int так же имеется).

Так вот что мне сделала моя учительница: она убрала нафиг мой собственный оператор != и изменила иф так:
if(37 != cur)
{}
ВТФ и эта фигня заработала! Вопрос: ПОЧЕМУ?
Была версия моя что != сравнивает сначала тип указателя, но она ее не приняла...
Прошу помогите я уверен что это не сложно, но как то слишком хитро а время поджимает! =(
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

18 окт 2007, 10:46

Привел бы ПОЛНОЕ описание класса.
М/б, например, есть оператор приведения типа data к числу? Если так, то компилятор сравнивает два числа.
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

18 окт 2007, 15:13

class data
{
int god;
int month;
int day;

public:
data(int,int,int);
data(int day2); //konstructor iz INT v data
data(char* date); //konstructor iz char* v data
data(void);

inline int rday(data x);
inline int rmonth(data x);
inline int rgod(data x);
friend data operator + (data x, int d );
friend bool operator != (data x1, data x2);
friend ostream& operator << (ostream& s, data x);
friend istream& operator >> (istream& s, data& x);
friend data fun(data);
};

data operator + (data x, int d)
{
d=d+x.day;
while( d>31 )
{ x.month=x.month+1;

if(x.month>12)
{x.month=x.month+1;
x.god=x.god+1;}

d=d-31;
}
x.day = d;
return x;
}


bool operator != (data x1, data x2)
{if(x1.day != x2.day || x1.month != x2.month || x1.god !=x2.god)
return false;
else
return true;}

data fun(data x)
{
data cur;
data y;
struct tm* ptr; //Тут создаю стандартный класс(структуру) в которую пихаю
//текущее время
time_t lt;
lt=time('\0');
ptr=localtime(&lt);
cur.god=ptr->tm_year;
cur.month=ptr->tm_mon;
cur.day=ptr->tm_mday;

if( (x+37)!=cur ) //Здесь она изменилана if(37 != cur) и эта сволочь всерано работала
y= y*511;
else
y=x+250;

return y;
}

Ну и если захотите запустить эту фигню у себя на компе вот еще функции:

istream& operator >>(istream& s, data& x)
{
cout<<endl<<"Input day: ";
s>>x.day;
cout<<endl<<"Input month: ";
s>>x.month;
cout<<endl<<"Input god: ";
s>>x.god;
return s;
}

ostream& operator << (ostream& s, data x)
{
return(s<<x.day<<"."<<x.month<<"."<<x.god);
}

data::data(int d,int m,int g)
{
day=d;
month=m;
god=g;
}

#include "stdafx.h"
#include"iostream"
#include"conio.h"
#include"string"
#include"ctime"
void main(void) // Писал маин прям тут вручную без проверки но думаю что
//будет работать
{
system("cls");
data x(20,3,90);
cout<<fun(x);
_getch();
}
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

18 окт 2007, 15:59

У меня компилятор ругается на строку:
y= y*511;

Текст:
error C2676: binary '*' : 'class data' does not define this operator or a conversion to a type acceptable to the predefined operator

Компилировался на MS VC 6.0

На самом деле, если у тебя ЭТОТ текст компилируется без ошибок (т.е. вероятно, у тебя другой компилятор), то мое предполложение подтверждается: каким-то образом компилятор умудряется сделать приведение типа от data к целому. А зетем уже перемножает (y= y*511) или сравнивает (if(37 != cur)) два целых.

Почему и как это происходит - фиг знает.

---------------------

UPDATED. Хотя, да. Убрал этот "проблемный" оператор (y= y*511), заменил if( (x+37)!=cur ) на if( 37 !=cur ) - компилируется!
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

18 окт 2007, 16:12

Кажется, понял в чем дело.

У тебя описан конструктор "из int в data":
data(int day2); //konstructor iz INT v data
Его-то помпилятор и использует при сравнении условия
( 37 !=cur )

Компилятор неявно пробразует целое 37 в data и далее сравнивает два экземпляра типа data (применяя описанный оп-р !=)

Если убрать из описания:
data(int day2); //konstructor iz INT v data
или:
friend bool operator != (data x1, data x2);
то на ( 37 !=cur ) получим ошибку:
error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'const int' (or there is no acceptable conversion)
Аватара пользователя
Vladimir89
Сообщения: 75
Зарегистрирован: 21 май 2007, 02:25

18 окт 2007, 17:07

На счет звездочки - простите грешен.. это был еще один оператор присваивания ДАТА= ДАТА. Но спасибо за подсказку большое! Сам бы я врядли догадался...
Ответить