Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Неявное преобразование в пользовательские типы

7.9K
08 марта 2005 года
guest2005
15 / / 05.02.2005
Доброго времени суток!

Подскажите, плиз, что не так:

class Complex
{
double Re, Im;
public
Complex()
{Re=0; Im=0};
Complex(double r)
{ Re=r; Im=0;};
operator+(Complex&);
operator-(Complex&);
operator*(Complex&);
operator/(Complex&);
...
}

Во все книжках написано, что должны выполняться следующие выражения:

Complex a;
a=a*0.1+0.1; // и т.д.

По идее должно происходить неявное преобразование типа double в Complex, но этого не происходит!? Получается только так: a=0.1;

А если так, то

a=a+0.1; // [C++ Error] Unit1.cpp(55): E2094 'operator+' not implemented in type 'Complex' for arguments of type 'double'
a=0.1*a; // [C++ Error] Unit1.cpp(55): E2096 Illegal structure operation

Вроде и конструктор для преобразования есть и все операторы, пробовал и friend Complex operator(Complex&, Complex&), результат тот же. Я в замешательстве :)

Заранее СПАСИБО!
301
08 марта 2005 года
lord Kelvin
897 / / 08.11.2004
Код:
class Complex
{
double Re, Im;
public
Complex()
{Re=0; Im=0};
Complex(double r)
{ Re=r; Im=0;};
operator+(Complex&[color=red],Complex&[/color]);
operator-(Complex&[color=red],Complex&[/color]);
operator*(Complex&[color=red],Complex&[/color]);
operator/(Complex&[color=red],Complex&[/color]);
...
}
7.9K
08 марта 2005 года
guest2005
15 / / 05.02.2005
Цитата:
Originally posted by lord Kelvin
 
Код:
...
operator+(Complex&[color=red],Complex&[/color]);
operator-(Complex&[color=red],Complex&[/color]);
operator*(Complex&[color=red],Complex&[/color]);
operator/(Complex&[color=red],Complex&[/color]);
...
}



Переписал:

 
Код:
...
  friend Complex operator+(Complex&,Complex&);
  friend Complex operator-(Complex&,Complex&);
  friend Complex operator*(Complex&,Complex&);
  friend Complex operator/(Complex&,Complex&);
  ...


Ничего не изменилось, те же ошибки!
487
08 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by guest2005


Переписал:
 
Код:
...
  friend Complex operator+(Complex&,Complex&);
  friend Complex operator-(Complex&,Complex&);
  friend Complex operator*(Complex&,Complex&);
  friend Complex operator/(Complex&,Complex&);
  ...


Ничего не изменилось, те же ошибки!



'operator+' not implemented in type 'Complex' for arguments of type 'double':

По русски это означает что для оператора + типа "Complex" не определен аргумент типа "double". Отсюда - решение проблемы элементарное - определи оператор + где одним из аргумкентов будет переменная типа "double". А именно так:

 
Код:
...
  friend Complex operator+(Complex&,double&);
  friend Complex operator-(Complex&,double&);
  friend Complex operator*(Complex&,double&);
  friend Complex operator/(Complex&,double&);
  ...
7.9K
09 марта 2005 года
guest2005
15 / / 05.02.2005
Цитата:
Originally posted by ddnh_bc


'operator+' not implemented in type 'Complex' for arguments of type 'double':

По русски это означает что для оператора + типа "Complex" не определен аргумент типа "double". Отсюда - решение проблемы элементарное - определи оператор + где одним из аргумкентов будет переменная типа "double".
[/code]



Спасибо за комментарий!
Дело в том, что я хочу добиться именно АвтоматическогО преобразования. Для этого вроде как достаточно написать конструктор с одним формальным параметром, с типом из которого хочешь произвести преобразование. В 3 книгах так написано.
Я скоро лопну от любопытства. Что не ТАК!?!?!

368
09 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by guest2005

Спасибо за комментарий!
Дело в том, что я хочу добиться именно АвтоматическогО преобразования. Для этого вроде как достаточно написать конструктор с одним формальным параметром, с типом из которого хочешь произвести преобразование. В 3 книгах так написано.
Я скоро лопну от любопытства. Что не ТАК!?!?!

Попробуй
const Complex operator+([color=red]const[/color] Complex&);

487
09 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by guest2005


Спасибо за комментарий!
Дело в том, что я хочу добиться именно АвтоматическогО преобразования. Для этого вроде как достаточно написать конструктор с одним формальным параметром, с типом из которого хочешь произвести преобразование. В 3 книгах так написано.
Я скоро лопну от любопытства. Что не ТАК!?!?!



Тогда попробуй еще так - уже в самом коде:

 
Код:
Complex a;
a=a+(Complex)0.1;


Дело в том что я не слышал о том чтобы можно было так на автомате преобразовать стандартный тип к классу. А вот если сделать (Complex)(double) - это будет равносильно new Complex(double) и далее уже все будет нормально. По идее еще можно попробовать перекрыть istream, ostream - но сейчас на вскидку не скажу как.
7.9K
09 марта 2005 года
guest2005
15 / / 05.02.2005
По поводу неявного преобразования, если кто не знает...

Язык программирования С++
Бьерн Страуструп.

Цитата:
7.3.1 КОНСТРУКТОРЫ

Вместо того, чтобы описывать несколько функций, можно описать конструктор, который из параметра double создает complex:
class complex {
// ...
complex(double r) { re=r; im=0; }
};

Этим определяется как получить complex, если задан double. Это традиционный способ расширения вещественной прямой до комплексной плоскости. Конструктор с единственным параметром не обязательно вызывать явно:
complex z1 = complex(23);
complex z2 = 23;
Обе переменные z1 и z2 будут инициализироваться вызовом complex(23). Конструктор является алгоритмом создания значения заданного типа. Если требуется значение некоторого типа и существует строящий его конструктор, параметром которого является это значение, то тогда этот конструктор и будет использоваться. Так, класс complex можно было описать следующим образом:

class complex {
double re, im;
public:
complex(double r, double i =0) { re=r;im=i; }

friend complex operator+(complex, complex);
friend complex operator*(complex, complex);
// ...
};

Все операции над комплексными переменными и целыми константами с учетом этого описания становятся законными. Целая константа будет интерпретироваться как комплексное число с мнимой частью, равной нулю. Так, a=b*2 означает
a = operator*(b, complex( double(2), double(0) ) )



А что касается моей проблемы то всё заработало как только я вместо

 
Код:
friend Complex operator+(Complex&,Complex&);
  friend Complex operator-(Complex&,Complex&);
  friend Complex operator*(Complex&,Complex&);
  friend Complex operator/(Complex&,Complex&);

написал
 
Код:
friend Complex operator+(Complex,Complex);
  friend Complex operator-(Complex,Complex);
  friend Complex operator*(Complex,Complex);
  friend Complex operator/(Complex,Complex);


непонятно толко, почему?
259
09 марта 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by guest2005
По поводу неявного преобразования, если кто не знает...

Язык программирования С++
Бьерн Страуструп.



А что касается моей проблемы то всё заработало как только я вместо
 
Код:
friend Complex[COLOR=red]&[/COLOR] operator+(Complex&,Complex&);
  friend Complex[COLOR=red]&[/COLOR] operator-(Complex&,Complex&);
  friend Complex[COLOR=red]&[/COLOR] operator*(Complex&,Complex&);
  friend Complex[COLOR=red]&[/COLOR] operator/(Complex&,Complex&);

написал
 
Код:
friend Complex operator+(Complex,Complex);
  friend Complex operator-(Complex,Complex);
  friend Complex operator*(Complex,Complex);
  friend Complex operator/(Complex,Complex);


непонятно толко, почему?


Если бы Вы написали так, то тоже все заработало. У Вас типы операндов и тип возвращаемого значения разные. И Вам надо бы было тогда описывать несколько операций.

7.9K
09 марта 2005 года
guest2005
15 / / 05.02.2005
Ну, кажется, теперь всё понятно. Всем спасибо за участие!
368
09 марта 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by guest2005
непонятно толко, почему?

Потому-что во втором случае значения передаются по значению, а не по ссылке. Если передаются по ссылке, тогда теоретически могут быть изменены, поэтому комп. не применяет неявное преобразование.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог