Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Не соображу что не так при перегрузке оператора =...   Найти похожие ветки 

 
Vulko ©   (2005-05-17 22:09) [0]

Заранее прошу не тереть модеров тему. Хоть и я пишу всё на C++, но в данном случае разницы нету никакой. На дельфи всё почти также.

Есть класс динамической матрицы. Пишу перегрузку оператора =, чтобы можно было легко присваивать матрицы.

В итоге присвоения не происходит. Хоть убей, не пойму что не так в алгоритме присваивания...


class Array2D
 {
   double **base;
   int columnSize;
   int rowSize;
  public:
   Array2D(int arrayColumnSize, int arrayRowSize); //Êîíñòðóêòîð
   ~Array2D(); //Äåñòðóêòîð
   void push(int, int, double psh); // Ââîä
   double pop(int i, int j); // Âûâîä
   void GetSize(int &n, int &m); // Âûâîä ðàçìåðîâ ìàòðèöû
   Array2D &operator=(Array2D &arr);
 };

// Êîíñòðóêòîð îáúåêòîâ êëàññà
 Array2D::Array2D(int arrayColumnSize, int arrayRowSize)
  {
   base = new double*[arrayColumnSize];
    for ( int i = 0; i < arrayColumnSize; ++i )
     base[i] = new double[arrayRowSize];
   rowSize = arrayRowSize;
   columnSize = arrayColumnSize;
    for ( int i = 0; i < columnSize; ++i )
     for ( int j = 0; j < rowSize; ++j )
      base[i][j] = 0;
  }

// &#196;&#229;&#241;&#242;&#240;&#243;&#234;&#242;&#238;&#240; &#238;&#225;&#250;&#229;&#234;&#242;&#238;&#226; &#234;&#235;&#224;&#241;&#241;&#224;
 Array2D::~Array2D()
  {
   for ( int i = 0; i < columnSize; ++i )
    delete[] base[i];
   delete[] base;
  }

// &#194;&#226;&#238;&#228; [i, j]-&#242;&#238;&#227;&#238; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224; &#236;&#224;&#241;&#241;&#232;&#226;&#224;
 void Array2D::push(int i, int j, double psh)
  {
   base[i][j] = psh;
  }

// &#194;&#251;&#226;&#238;&#228; [i, j]-&#242;&#238;&#227;&#238; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224; &#236;&#224;&#241;&#241;&#232;&#226;&#224;
 double Array2D::pop(int i, int j)
  {
   return base[i][j];
  }

// &#194;&#251;&#226;&#238;&#228; &#240;&#224;&#231;&#236;&#229;&#240;&#238;&#226; &#236;&#224;&#242;&#240;&#232;&#246;&#251;
 void Array2D::GetSize(int &n, int &m)
  {
   n = columnSize;
   m = rowSize;;
  }

// &#207;&#240;&#232;&#241;&#226;&#224;&#232;&#226;&#224;&#237;&#232;&#229;
 Array2D &Array2D::operator=(Array2D &arr)
  {
   int i, j, k, l;
   this -> GetSize(i, j);
   arr.GetSize(k, l);
   if (i != k)
    if (j != l)
     for (i = 0; i < k; i++)
      for (j = 0; j < l; j++)
       this -> push( i, j, arr.pop(i, j) );
   return *this;
  }


 
Vulko ©   (2005-05-17 22:24) [1]

Ну неужто никто про c++ не слышал? :)))


 
wicked ©   (2005-05-17 22:26) [2]

навскидку, что покоробило

>  Array2D &Array2D::operator=(const Array2D &arr)
>   {
>    int i, j, k, l;
>    GetSize(i, j);
>    arr.GetSize(k, l);
>    if (i == k && j == l)
>      for (i = 0; i < k; i++)
>       for (j = 0; j < l; j++)
>         push( i, j, arr.pop(i, j) );
>    return *this;
>   }

и this то зачем?.... для понту?...


 
jack128 ©   (2005-05-17 22:33) [3]

Vulko ©   (17.05.05 22:09)
На дельфи всё почти также.

Класс.

Не, я конечно, понимаю, в d8/9 перегрузка операторов есть, но синтаксис как то не очень похож на сишный..


 
Vulko ©   (2005-05-17 22:36) [4]

wicked О!. Я долго думал как мне 2 условия объединить. Оказывается нельзя if () & () делать :)

По поводу this, не для понту. Просто я не опустил "this->".


 
Vulko ©   (2005-05-17 22:37) [5]

jack128, не 100% похож, но достаточно похож.

Ну а делать нечего. Я больше не знаю форумов, где могут ответить мгновенно...


 
Kerk ©   (2005-05-17 22:38) [6]

Vulko ©   (17.05.05 22:36) [4]
if (() & ())

?


 
Vulko ©   (2005-05-17 22:40) [7]

Kerk, после сообщения wicked я сообразил что к чему в плане оператора if. Я просто привык к дельфе... а тут чуть не так.


 
Piter ©   (2005-05-17 22:40) [8]

Vulko ©   (17.05.05 22:09)
На дельфи всё почти также


особенно если учесть, что в D нету перегрузки операторов :)


 
Piter ©   (2005-05-17 22:41) [9]

jack128 ©   (17.05.05 22:33) [3]

а-а-а... все таки сделали...


 
wicked ©   (2005-05-17 22:42) [10]

> Vulko ©   (17.05.05 22:36) [4]
а зачем this-> то?... для красоты?...

> Kerk ©   (17.05.05 22:38) [6]
эта... не путайте & с && (а также | с ||) - это разные операции, причем имеющие разный приоритет, что позволяет писать условия без скобок: a == b && c == d
ср. с паскалем: (a = b) and (c = d)
что будет, если убрать скобки в паскаль-варианте?....


 
Eraser ©   (2005-05-17 22:43) [11]

Piter ©

В .NET с самого начала была перегрузка...


 
wicked ©   (2005-05-17 22:44) [12]

> Vulko ©   (17.05.05 22:36) [4]
и эта, на const для параметра обратите внимание - c++ в этом плане очень щепетилен....


 
Kerk ©   (2005-05-17 22:44) [13]

wicked ©   (17.05.05 22:42) [10]

да знаю я что будет :)


 
Vulko ©   (2005-05-17 22:50) [14]

wicked, добавил const. Никакого эффекта...

Боюсь дело всё-таки в другом... Только вот в чём?! :(


 
wicked ©   (2005-05-17 22:58) [15]

> Vulko ©   (17.05.05 22:50) [14]
код класса выкладуй... если руки дойдут - поглядим...


 
Vulko ©   (2005-05-17 22:59) [16]

И ещё - компилятор ругается (но компилит) на то, что функции getsize и pop non-const.

Может в этом проблема?
Но как исправить?


 
wicked ©   (2005-05-17 23:00) [17]


> И ещё - компилятор ругается (но компилит) на то, что функции
> getsize и pop non-const.

const в конце декларации в h-файле приписать...


 
wicked ©   (2005-05-17 23:01) [18]

в смысле, вот так
  double pop(int i, int j) const;
  void GetSize(int &n, int &m) const;


 
Vulko ©   (2005-05-17 23:02) [19]

Файл кстати не h, а cpp. Меня вот ещё давно интересовал вопрос - чем h от cpp отличается?

Итак:
Код класса

class Array2D
 {
   double **base;
   int columnSize;
   int rowSize;
  public:
   Array2D(int arrayColumnSize, int arrayRowSize); //&#202;&#238;&#237;&#241;&#242;&#240;&#243;&#234;&#242;&#238;&#240;
   ~Array2D(); //&#196;&#229;&#241;&#242;&#240;&#243;&#234;&#242;&#238;&#240;
   void push(int, int, double psh); // &#194;&#226;&#238;&#228;
   double pop(int i, int j); // &#194;&#251;&#226;&#238;&#228;
   void GetSize(int &n, int &m); // &#194;&#251;&#226;&#238;&#228; &#240;&#224;&#231;&#236;&#229;&#240;&#238;&#226; &#236;&#224;&#242;&#240;&#232;&#246;&#251;
   Array2D &operator=(const Array2D &arr);
 };

// &#202;&#238;&#237;&#241;&#242;&#240;&#243;&#234;&#242;&#238;&#240; &#238;&#225;&#250;&#229;&#234;&#242;&#238;&#226; &#234;&#235;&#224;&#241;&#241;&#224;
 Array2D::Array2D(int arrayColumnSize, int arrayRowSize)
  {
   base = new double*[arrayColumnSize];
    for ( int i = 0; i < arrayColumnSize; ++i )
     base[i] = new double[arrayRowSize];
   rowSize = arrayRowSize;
   columnSize = arrayColumnSize;
    for ( int i = 0; i < columnSize; ++i )
     for ( int j = 0; j < rowSize; ++j )
      base[i][j] = 0;
  }

// &#196;&#229;&#241;&#242;&#240;&#243;&#234;&#242;&#238;&#240; &#238;&#225;&#250;&#229;&#234;&#242;&#238;&#226; &#234;&#235;&#224;&#241;&#241;&#224;
 Array2D::~Array2D()
  {
   for ( int i = 0; i < columnSize; ++i )
    delete[] base[i];
   delete[] base;
  }

// &#194;&#226;&#238;&#228; [i, j]-&#242;&#238;&#227;&#238; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224; &#236;&#224;&#241;&#241;&#232;&#226;&#224;
 void Array2D::push(int i, int j, double psh)
  {
   base[i][j] = psh;
  }

// &#194;&#251;&#226;&#238;&#228; [i, j]-&#242;&#238;&#227;&#238; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224; &#236;&#224;&#241;&#241;&#232;&#226;&#224;
 double Array2D::pop(int i, int j)
  {
   return base[i][j];
  }

// &#194;&#251;&#226;&#238;&#228; &#240;&#224;&#231;&#236;&#229;&#240;&#238;&#226; &#236;&#224;&#242;&#240;&#232;&#246;&#251;
 void Array2D::GetSize(int &n, int &m)
  {
   n = columnSize;
   m = rowSize;;
  }

// &#207;&#240;&#232;&#241;&#226;&#224;&#232;&#226;&#224;&#237;&#232;&#229;
 Array2D &Array2D::operator=(const Array2D &arr)
  {
   int i, j, k, l;
   GetSize(i, j);
   arr.GetSize(k, l);
   if (i != k && j != l)
    for (i = 0; i < k; i++)
     for (j = 0; j < l; j++)
      push( i, j, arr.pop(i, j) );
   return *this;
  }


 
jack128 ©   (2005-05-17 23:03) [20]

wicked ©   (17.05.05 22:42) [10]
что будет, если убрать скобки в паскаль-варианте?....

А какая нафиг разница?? Просто скобки везде нужно ставить и не задумываться о таких мелочах, как приоритет операций.. С это тоже касается..


 
wicked ©   (2005-05-17 23:05) [21]

> jack128 ©   (17.05.05 23:03) [20]
а влом бывает к шифту тянуться...
и приоритет операций отнюдь не мелочь - иногда таких глЮков можно в 3-х строчках накрутить...


 
Vulko ©   (2005-05-17 23:05) [22]

wicked, сделал.
Но:
1. Это всё равно не поможет.
2. Как это назвается, и что делает. Я про const в конце прототипа функции.


 
Vulko ©   (2005-05-17 23:18) [23]

Я понял в чём дело!

Из-за !=. Надо было просто заменить это на ==. Не знаю правда почему... но не важно.


 
wicked ©   (2005-05-17 23:20) [24]


> Из-за !=. Надо было просто заменить это на ==. Не знаю правда
> почему... но не важно.

бегом читать книжки... много книжек по си... без классов и прочей муры...


 
Vulko ©   (2005-05-17 23:28) [25]

wicked, да книжки есть. Всякие. Читать некогда :)

Да и не из-за книжки это. Я посмотрел в хелпе - там написано что они одинаковые...


here are two equality operators: == and !=. They test for equality and inequality between arithmetic or pointer values, following rules very similar to those for the relational operators.

Note: Notice that == and != have a lower precedence than the relational operators < and >, <=, and >=. Also, == and != can compare certain pointer types for equality and inequality where the relational operators would not be allowed.

The syntax is

equality-expression:

relational-expression
equality-expression == relational-expression

equality-expression != relational-expression


 
wicked ©   (2005-05-17 23:33) [26]

дык там черным по белому написано (вольный перевод):
есть два оператора равенства: == и !=. они тестируют на равенство и неравенство (подразумевается соответственно) арифметических и указующих значений...
и всё... == - на равенство, != - на неравенство... точка...


 
Piter ©   (2005-05-18 00:36) [27]

Eraser ©   (17.05.05 22:43) [11]
.NET с самого начала была перегрузка


как это? Что ты подразуемваешь под .NET? C#?


 
Piter ©   (2005-05-18 00:37) [28]

wicked ©   (17.05.05 23:05) [21]
а влом бывает к шифту тянуться


видмо, отступы строк для тебя неведомы... тут ведь к пробелу надо тянуться... а то и к TAB"у...


 
Eraser ©   (2005-05-18 00:48) [29]

Piter ©

В т.ч. и C#.


 
wicked ©   (2005-05-18 00:54) [30]

> Piter ©   (18.05.05 00:37) [28]
а ты мой код видел?... или телепатор настроен?.... ;)


 
Piter ©   (2005-05-18 00:59) [31]

Eraser ©   (18.05.05 0:48) [29]

но ведь Дельфи это не C#?


 
chii   (2005-05-18 07:35) [32]

По поводу оператора присваивания. Если он есть, то в классе обязательно должен быть конструктор копирования, если класс будет передаваться куда-либо по значению, возвращаться из фукции, инициализироваться экземпляром этого же класса.
Например, если вы создали класс в стеке и не определили конструктор копирования, то в результате будет скопировано только значение указателя, но не данные, и вы получите очень хитрую ошибку (после возврата из функции данные в стеке исчезнут). По поводу того, что такое конструктор копирования - ЧИТАТЬ КНИЖКИ. Всекда определяйте конструктор копирования без тела (в определении класса). При попытке его использования вы получите сообщение об ошибке и сохраните время на их отлов. Если нужно запретить копирование - объявите такой конструктор как private и не переопределяйте оператор присваивания.


 
chii   (2005-05-18 07:52) [33]

>после возврата из функции данные в стеке исчезнут
брр. сумбур написал. данные конечно в куче, но деструктор, того объекта, который в стеке, их того, и в основной программе при хорошем раскладе получится access violation.


 
Vulko ©   (2005-05-18 09:03) [34]

chii, я знаю что такое конструктор копий. Спасибо за подстказуку, конечно, но смысла нету бедать в данном классе конструктор копий, т.к. всё равно я не собираюсь передавать объекти типа Array2D в функции. Это всё-го лишь простая лаба по программированию. Хотя конечно можно сделать конструктор копий, чтобы преподу "пыль в глаза пустить".


 
pasha_golub (temp)   (2005-05-18 09:07) [35]

Удалено модератором
Примечание: AutoModerator


 
Igorek ©   (2005-05-18 14:20) [36]

Vulko ©   (17.05.05 23:02) [19]
Пока на 2 с плюсом. :)


 
VMcL ©   (2005-05-18 15:10) [37]

>>jack128 ©   (17.05.05 23:03) [20]

>Просто скобки везде нужно ставить и не задумываться о таких мелочах, как приоритет операций

Задумываться о приоритете операций не нужно, его нужно знать. И не ставить лишних скобок, дабы не ухудшать читабельность кода. ИМХО.

>>Eraser ©   (17.05.05 22:43) [11]

.NET - это не язык.


 
Eraser ©   (2005-05-18 15:17) [38]

VMcL ©
.NET - это не язык.


Эт понятно. Я имел ввиду delphi.Net, j# и т.д.


 
VMcL ©   (2005-05-18 18:14) [39]

>>Eraser ©   (18.05.05 15:17) [38]

VB.NET не поддерживает написание перегружаемых операторов, так что "и т. д." не конает. :-p


 
марсианин ©   (2005-05-19 01:19) [40]

2Vulko ©   (17.05.05 22:09)

вместо массивов в стиле паскаля просто используй вектор.. std::vector <double>
никаких операторов присваивания и копирующих конструкторов перегружать тогда не надо. сработают те, что по умолчанию..

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

что касается самого оператора, то что, он сработает только в том случае, если размеры матриц совпадают?

я считаю более логичным определить не массив массивов, а 1 массив (или вектор) типа double размера  columnSize * rowSize, и выбирать оттуда элементы.

вот такие пироги..



Страницы: 1 2 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.026 c
1-1117521519
liver
2005-05-31 10:38
2005.06.14
Alt + F4


3-1115364541
new_one
2005-05-06 11:29
2005.06.14
ошибка при работе с таблицей


1-1117194534
Masta Hookah
2005-05-27 15:48
2005.06.14
"ZIP" -> COMPRESSED


1-1117451915
Mouserx
2005-05-30 15:18
2005.06.14
Использование inherited


1-1117381279
Serg1981
2005-05-29 19:41
2005.06.14
Отдельный hint для каждого элемента ListView