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

Ваш аккаунт

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

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

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

что/кто правильнее BCB vs VC

8.8K
07 декабря 2005 года
dark_king
35 / / 27.10.2005
У меня стоит Microsoft Visual Studio .NET и BCB6. Давно подозревал, что BCB меня обманымает. Но это уже слишком. Есть класс матиц. в нем перегружен оператор присваивания, присутствуют дружественные операторы арифмет. действий. Все необходимые конструкторы и деструкторы на месте. ЕСТЬ ТАК_ЖЕ консольное приложение, которое имеет доступ к вышеописанному классу. Так вот. При компиляции в VC строки вида
 
Код:
matrix a=b*c*b;
все нормально, а BCB выдает ошибку
 
Код:
E2093 Operator 'operator+' not implemented in type 'matrix' for arguments of the same type
При этом со строкой
 
Код:
matrix a=b*c;
оба справляются нормально. Так что-же на самом деле правильнее (прежде всего с точки зрения стандартного С++) и если можно это исправить в BCB, то как?
585
07 декабря 2005 года
honeybeer
297 / / 06.09.2004
это называется сцепленные операции, реализацию перегрузки в студию
P.S.
VC с настройками по умолчанию от ANSI-стандарта далек... мама не горюй, и позволяет выделывать курбеты, от которых любой другой компилятор сойдет с ума (ИМХО не есть гут)
362
07 декабря 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by honeybeer
это называется сцепленные операции, реализацию перегрузки в студию



Да-да, показывай как перегружал. Я точно знаю, что как раз матрицы и как раз BCB перемножал у меня в любом количестве (ABCD-метод расчета резонаторов :)).

А что, гуи-приложение нормально глотает конструкцию?

8.8K
09 декабря 2005 года
dark_king
35 / / 27.10.2005
Цитата:
Originally posted by _kolyan
Да-да, показывай как перегружал. Я точно знаю, что как раз матрицы и как раз BCB перемножал у меня в любом количестве (ABCD-метод расчета резонаторов :)).

А что, гуи-приложение нормально глотает конструкцию?


Пожалуйста:

Код:
class matrix{
private:
  int w, h;
  double **d;
  void destroy();
  void create(int H, int W);
public:
  matrix(int H = 0, int W = 0);
  matrix(matrix& A);
  ~matrix();
  matrix operator=(matrix a);
  friend ostream& operator<<(ostream& os, matrix& m);
  friend istream& operator>>(istream& is, matrix& m);
  friend matrix operator*(matrix& a, matrix& b);
  friend matrix operator+(matrix& a, matrix& b);
  friend matrix operator-(matrix& a, matrix& b);
};

Ну примерно так. Единственный нюанс в том, что при реализации используется рекурсия. В моем случае этого не избежать, т.к. это самая суть метода. Сам код достаточно громоздкий, т.ч. вышлю по первому требованию
585
09 декабря 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by dark_king
Пожалуйста:
Код:
class matrix{
private:
  int w, h;
  double **d;
  void destroy();
  void create(int H, int W);
public:
  matrix(int H = 0, int W = 0);
  matrix(matrix& A);
  ~matrix();
  matrix operator=(matrix a);
  friend ostream& operator<<(ostream& os, matrix& m);
  friend istream& operator>>(istream& is, matrix& m);
  friend matrix operator*(matrix& a, matrix& b);
  friend matrix operator+(matrix& a, matrix& b);
  friend matrix operator-(matrix& a, matrix& b);
};

Ну примерно так. Единственный нюанс в том, что при реализации используется рекурсия. В моем случае этого не избежать, т.к. это самая суть метода. Сам код достаточно громоздкий, т.ч. вышлю по первому требованию


Это не реализация и ничего не дает, и еще, зачем friend перед operator+-*?

2.4K
09 декабря 2005 года
dinasok51
219 / / 12.11.2005
IMHO это ошибка компилятора Borland'а
тк с перегрузкой все ОК.

Иногда помогает изменение последовательности объявлений:
friend matrix operator+(matrix& a, matrix& b);
friend matrix operator-(matrix& a, matrix& b);
friend matrix operator*(matrix& a, matrix& b);




honeybeer
Если не friend, то операции не симметричны
585
09 декабря 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by dinasok51

honeybeer
Если не friend, то операции не симметричны


Это верно.
Но по поводу ошибки bilderа - не факт. Не вижу реализации

2.4K
09 декабря 2005 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by honeybeer
Это верно.
Но по поводу ошибки bilderа - не факт. Не вижу реализации



Если оператор объявлен корректно и соответствующая функция также корректна с точки зрения языка,
то вне зависимости от реализации компилятор не должен выдавать ошибку.

8.8K
10 декабря 2005 года
dark_king
35 / / 27.10.2005
Цитата:
Originally posted by dinasok51
Если оператор объявлен корректно и соответствующая функция также корректна с точки зрения языка,
то вне зависимости от реализации компилятор не должен выдавать ошибку.


Вроде разобрался. Если перегруженную функцию объявить членом класса, то все работает. И если разобраться, то это правильно. Ведь если дружественную функцию объявить например так:

 
Код:
friend matrix operator*(int, matrix&);

Как тогда компиллятор должен реагировать на строку вида:
 
Код:
matrix a=b*c*d;
8.8K
10 декабря 2005 года
dark_king
35 / / 27.10.2005
Цитата:
Originally posted by dark_king
Вроде разобрался. Если перегруженную функцию объявить членом класса, то все работает. И если разобраться, то это правильно. Ведь если дружественную функцию объявить например так:
 
Код:
friend matrix operator*(int, matrix&);

Как тогда компиллятор должен реагировать на строку вида:
 
Код:
matrix a=b*c*d;


Вот сейчас точно разобрался. Паруметры в функцию перегрузки передаются не по ссылке, а по значению, т.е.

 
Код:
friend matrix operator*(matrix , matrix);

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