Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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, и выбирать оттуда элементы.

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


 
Eraser ©   (2005-05-19 01:23) [41]

VMcL ©   (18.05.05 18:14) [39]

Ну я не спец. по VB так что "не пинайте слишком сильно" (c) непомню_кто )


 
VMcL ©   (2005-05-19 08:52) [42]

>>Eraser ©   (19.05.05 01:23) [41]

Кстати, насколько мне помнится, перегрузка операторов не является частью CLS; эта фича конкретного языка.


 
Vulko ©   (2005-05-22 22:22) [43]

марсианин, задача изначально стоит - показать знание динамического создания объектов, перегрузки операторов и т.п. и т.д.
Так что использование стандартного класса не катит.

Насчёт коструктора копий - это хорошо. Сам бы я не додумался его в закрытой части класса объявить :)


 
Eraser ©   (2005-05-23 00:42) [44]

VMcL ©
Кстати, насколько мне помнится, перегрузка операторов не является частью CLS; эта фича конкретного языка.


Это да, из моих довольно обрывочных знаний по .NET тоже помнится, что CLS это типа помеси C с ассемблером ;-)


 
VMcL ©   (2005-05-23 00:56) [45]

>>Eraser ©   (23.05.05 00:42) [44]

>CLS это типа помеси C с ассемблером ;-)

Кхм, кхм... Это Вы CLS с IL перепутали.

CLS = Common Langauge Specification
http://www.answers.com/topic/cls?method=6

IL = Intermediate Language
http://www.answers.com/topic/pseudocode?method=6


 
Eraser ©   (2005-05-23 01:15) [46]

VMcL ©   (23.05.05 00:56) [45]

Ну вот... сколько раз зарекался молчать в топиках по обсуждению .NET ))

перепутали

со мной можно на ТЫ, я вроде пока не сильно старый )


 
VMcL ©   (2005-05-23 09:24) [47]

>>Eraser ©   (23.05.05 01:15) [46]

>о мной можно на ТЫ, я вроде пока не сильно старый )

Невзирая на возраст собеседника, свой стиль общения я менять не собираюсь :-p

P.S.
А забавно я написАл: Langauge. Получился LAN Gauge =)



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

Форум: "Потрепаться";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.042 c
3-1114760089
Zhekson
2005-04-29 11:34
2005.06.14
InstallShield &amp; BDE


8-1109702013
Romantic
2005-03-01 21:33
2005.06.14
Громадный TImage


6-1111579314
Radgar
2005-03-23 15:01
2005.06.14
SendBuf


14-1117026294
menart
2005-05-25 17:04
2005.06.14
Языки программирования...


3-1115493471
Yurisimus
2005-05-07 23:17
2005.06.14
Как в Fast Report получить данные из двух таблиц...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский