Это смотря что ты хочешь сравнивать с нулем... То есть, что (для твоего класса) значит равенство нулю?
Для объекта можно было бы также переопределить "operator =", сравнивающий экземпляр объекта с целым числом, например... Для классов перегрузка операций проблематична.
сорри, FPC у меня нет, проверить могу только в делфи. но идея, наверное, понятна:
T=class a,b: integer; function isNull: boolean; end; ... function T.isNull: boolean; begin isNull:=(a=0)and(b=0); end;
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
идея интересная, но мне понадобится сравнивать и с другими числами
Ты бы уточнял, ЧЕГО ты хочешь? Либо КАЖДОЕ поле сравнивать с ОДНИМ И ТЕМ ЖЕ числом (тогда - вот так:
operator = (const X: T; const i: integer): boolean; begin result := (X.a = i) and (X.b = i); end; ... // тестируем: obj.init(3, 3); writeln(obj = 3);
obj.a := 9; writeln(obj = 9); ...
)
, либо (что в конце концов тебе выяснится, тебе и было нужно) каждое поле - с РАЗНЫМ числом...
Цитата
а где про нее можна прочитать?
Нигде нельзя... Попробуй то же самое сделать для Class-а, а не для Object-а, получишь ошибку компиляции... Для Object-ов и Record-ов все прекрасно работает...
Добрый день! У меня есть вопрос, мне надо перегрузить оператор присваивания... у меня он должен заключаться в следующем 1) присваивания между обьектами одного класса происходит стандартно(выражение слева приобретает выражение справа) 2) возможно когда выражение справа есть некий символ (а еще лучше если можно было бы использовать строку) тоесть есть класс направление (содержащий два поля -- x, y.). если я пишу
direction:='left';
, тогда должно происходить следующее
direction.x:= -1; direction.y:=0;
. Заранее благодарен.
Добавлено через 3 мин. и еще, нельзя ли использовать различные методы сравнения(в смысле перезагруженные операторы сравнения) в зависимости от передаваемых параметров?
operator := (const d: dir): T; begin with result do begin x := p[d].px; y := p[d].py; end; end;
operator := (const s: string): T; var i: dir; begin result.x := 0; result.y := 0;
for i := low(dir) to high(dir) do if p[i].s = s then with result do begin x := p[i].px; y := p[i].py; end;
end;
var x: T;
begin x := 'left'; x.print;
x := 'right'; // <--- Здесь - работаешь со строкой x.print;
x := up; // <--- А тут - с перечислимым типом x.print; end.
Цитата
нельзя ли использовать различные методы сравнения(в смысле перезагруженные операторы сравнения) в зависимости от передаваемых параметров?
Можно, только для этого должны перегружаться операторы для сравнения данных разных типов... Например, так:
// Тут твой тип будет сравниваться с целым числом operator < (x: T; i: integer): boolean; begin // ... end; // А тут - со вторым значением такого же типа operator < (x: T; i: T): boolean; begin // ... end;
2. Непонятен способ описания константы? Смотри, есть 2 способа. Можно сделать так:
type myrec = record // сначала опишем саму структуру (вернее, ее тип) s: string; px, py: integer; end; const p: array[dir] of myrec = ... // Описываем массив из этих структур
Но ведь, если мне больше нигде не нужно описание типа myrec (ну не собираюсь я его использовать больше в программе), то я могу определить этот тип прямо в описании константы. И теперь вступает в силу вот такое ограничение: я собственно тип "запись" нигде использовать не могу (поскольку он безымянный), а обращаться к полям записи через элемент массива - пожалуйста. Что и делается...
А array[dir] - собственно, создается массив такой длины, сколько элементов существует в перечислимом типе dir... То есть, приведенное выше объявление эквивалентно:
const p: array[low(dir) .. high(dir)] of record ...
или даже
const p: array[left .. dn] of record ...
Но я бы все-таки не рекомендовал пользоваться последним описанием, очень велика вероятность нарваться на ошибку, которую при первом описании ты не совершишь никогда (она будет поймана еще на этапе компиляции).
Ну, допустим, тем что множество - это набор значений некоего базового типа, а перечислимый тип определяет совершенно новый тип, никак не связанный ни с одним из уже существующих...
Нет... Во всяком случае - с помощью перечислимых типов - нет. Элементы таких типов должны быть правильными идентификаторами, а ты хочешь, чтобы тип содержал числа, так? Число правильным идентификатором не является.
Кроме всего прочего есть ограничение на размер перечислимых типов - 256 элементов. Integer побольше будет, я думаю...
А зачем? У тебя же есть уже Integer, зачем второй тебе? Ладно бы, задумал реализовать Int256 или Int1024, например, чтоб с длинными числами работать (кстати, уже было на форуме. Как-то для Aelita я делал подобную реализацию Int256)... Можно, например, реализовать так же, как в "Длинной арифметике", только ограничить количество элементов массива.
Перегрузка операций есть, значит, с переводом (строка -> число) и (число -> строка) проблем не будет. Сравнение элементов нового типа - тоже не проблема... Все реализуемо...
когда-то хотел ради интереса, но практического применения не нашел... хотя нет, если я захочу сделать свой компилятор( ), мне может это понадобится... но оставим это на потом...