Форум: "Потрепаться";
Текущий архив: 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;
}
// Äåñòðóêòîð îáúåêòîâ êëàññà
Array2D::~Array2D()
{
for ( int i = 0; i < columnSize; ++i )
delete[] base[i];
delete[] base;
}
// Ââîä [i, j]-òîãî ýëåìåíòà ìàññèâà
void Array2D::push(int i, int j, double psh)
{
base[i][j] = psh;
}
// Âûâîä [i, j]-òîãî ýëåìåíòà ìàññèâà
double Array2D::pop(int i, int j)
{
return base[i][j];
}
// Âûâîä ðàçìåðîâ ìàòðèöû
void Array2D::GetSize(int &n, int &m)
{
n = columnSize;
m = rowSize;;
}
// Ïðèñâàèâàíèå
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); //Êîíñòðóêòîð
~Array2D(); //Äåñòðóêòîð
void push(int, int, double psh); // Ââîä
double pop(int i, int j); // Âûâîä
void GetSize(int &n, int &m); // Âûâîä ðàçìåðîâ ìàòðèöû
Array2D &operator=(const 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;
}
// Äåñòðóêòîð îáúåêòîâ êëàññà
Array2D::~Array2D()
{
for ( int i = 0; i < columnSize; ++i )
delete[] base[i];
delete[] base;
}
// Ââîä [i, j]-òîãî ýëåìåíòà ìàññèâà
void Array2D::push(int i, int j, double psh)
{
base[i][j] = psh;
}
// Âûâîä [i, j]-òîãî ýëåìåíòà ìàññèâà
double Array2D::pop(int i, int j)
{
return base[i][j];
}
// Âûâîä ðàçìåðîâ ìàòðèöû
void Array2D::GetSize(int &n, int &m)
{
n = columnSize;
m = rowSize;;
}
// Ïðèñâàèâàíèå
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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.041 c