IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3 >  
 Ответить  Открыть новую тему 
> ООП во FP, робота с обьектами
сообщение
Сообщение #21


Гость






Цитата
можно ли для класса описать сравнение с нулем?
Это смотря что ты хочешь сравнивать с нулем... То есть, что (для твоего класса) значит равенство нулю?

Для объекта можно было бы также переопределить "operator =", сравнивающий экземпляр объекта с целым числом, например... Для классов перегрузка операций проблематична.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


сорри, FPC у меня нет, проверить могу только в делфи. но идея, наверное, понятна:
  T=class
a,b: integer;
function isNull: boolean;
end;
...
function T.isNull: boolean;
begin
isNull:=(a=0)and(b=0);
end;



--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


через метод не так интересно... интересно было бы именно перегрузкой операторов...
что б можна было скажем написать
...if a<>0 then ...
, где а -- пользовательский тип, имеющий два поля целых чисел, и равнявшийся нулю, если оба поля равны нулю...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Гость






В таком случае (если у тебя 2 поля должны быть одновременно нулевыми чтобы объект считался нулевым) тебе лучше перегрузить оператор not:

{$mode ObjFpc}
type
T = object
a, b: integer;

constructor init(va: integer = 0; vb: integer = 0);
end;

operator not (const X: T): boolean;
begin
result := (X.a = 0) and (X.b = 0);
end;

constructor T.init(va: integer; vb: integer);
begin
a := va; b := vb;
end;

var
obj: T;
begin
obj.init();
writeln(not obj);

obj.a := 9;
writeln(not obj);
end.



Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 25.06.2007 14:08) *
В таком случае (если у тебя 2 поля должны быть одновременно нулевыми чтобы объект считался нулевым) тебе лучше перегрузить оператор not...
идея интересная, но мне понадобится сравнивать и с другими числами(по крайней мере еще с одним)...
Цитата
Для классов перегрузка операций проблематична.
а где про нее можна прочитать?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Гость






Цитата
идея интересная, но мне понадобится сравнивать и с другими числами
Ты бы уточнял, ЧЕГО ты хочешь? Либо КАЖДОЕ поле сравнивать с ОДНИМ И ТЕМ ЖЕ числом
(тогда - вот так:
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-ов все прекрасно работает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 25.06.2007 15:55) *

Либо КАЖДОЕ поле сравнивать с ОДНИМ И ТЕМ ЖЕ числом, либо (что в конце концов тебе выяснится, тебе и было нужно) каждое поле - с РАЗНЫМ числом...
пока достаточно с одним...

посижу подумаю...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день!
У меня есть вопрос, мне надо перегрузить оператор присваивания...
у меня он должен заключаться в следующем
1) присваивания между обьектами одного класса происходит стандартно(выражение слева приобретает выражение справа)
2) возможно когда выражение справа есть некий символ (а еще лучше если можно было бы использовать строку)
тоесть есть класс направление (содержащий два поля -- x, y.). если я пишу
 direction:='left';
, тогда должно происходить следующее
direction.x:= -1; direction.y:=0;
.
Заранее благодарен.

Добавлено через 3 мин.
и еще, нельзя ли использовать различные методы сравнения(в смысле перезагруженные операторы сравнения) в зависимости от передаваемых параметров?

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






{$mode objfpc}
type
dir = (left, right, up, dn);
T = object
x, y: integer;
procedure print;
end;

procedure T.print;
begin
writeln('X: ', x, ' Y: ', y);
end;

const
p: array[dir] of record
s: string;
px, py: integer;
end =
(
(s:'left' ; px:-1; py: 0),
(s:'right'; px: 1; py: 0),
(s:'up' ; px: 0; py:-1),
(s:'dn' ; px: 0; py: 1)
);


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;

 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Огромное спасибо! но у меня есть пару вопросов, может некоторые прямо не касающееся темы...
Цитата(volvo @ 2.07.2007 19:16) *


type
dir = (left, right, up, dn); // ? dir это множество?
T = object
x, y: integer;
procedure print;
end;

const
p: array[dir] of record//???
s: string;
px, py: integer;
end = //?
(
(s:'left' ; px:-1; py: 0),
(s:'right'; px: 1; py: 0),
(s:'up' ; px: 0; py:-1),
(s:'dn' ; px: 0; py: 1)
);
оperator := (const d: dir): T; //вот это здорово!
//а то я делал по аналогии со сравнением,
//приходилось описывать возращаемый результат
//и 2 получаемых(правильный термин?)...



еще раз спасибо!


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Гость






1.
Цитата
dir это множество?
Нет, это перечислимый тип.

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 ...


Но я бы все-таки не рекомендовал пользоваться последним описанием, очень велика вероятность нарваться на ошибку, которую при первом описании ты не совершишь никогда (она будет поймана еще на этапе компиляции).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 4.07.2007 17:55) *
1. Нет, это перечислимый тип.
а где про него можна почитать? И чем он отличается от множества?

остальное вроде ясно.

спасибо!


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Гость






Перечислимые типы
сравни с:
Множественные типы

Цитата
И чем он отличается от множества?
Ну, допустим, тем что множество - это набор значений некоего базового типа, а перечислимый тип определяет совершенно новый тип, никак не связанный ни с одним из уже существующих...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


с горем пополам вроде понл
Цитата(volvo @ 4.07.2007 18:11) *
совершенно новый тип, никак не связанный ни с одним из уже существующих...
а вот это заинтересовало... можем ли мы с нуля создать свой integer


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Гость






Нет... Во всяком случае - с помощью перечислимых типов - нет. Элементы таких типов должны быть правильными идентификаторами, а ты хочешь, чтобы тип содержал числа, так? Число правильным идентификатором не является.

Кроме всего прочего есть ограничение на размер перечислимых типов - 256 элементов. Integer побольше будет, я думаю...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


а вообще возможно ли такое реализовать(именно с нуля)?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Гость






А зачем? У тебя же есть уже Integer, зачем второй тебе? Ладно бы, задумал реализовать Int256 или Int1024, например, чтоб с длинными числами работать (кстати, уже было на форуме. Как-то для Aelita я делал подобную реализацию Int256)... Можно, например, реализовать так же, как в "Длинной арифметике", только ограничить количество элементов массива.

Перегрузка операций есть, значит, с переводом (строка -> число) и (число -> строка) проблем не будет. Сравнение элементов нового типа - тоже не проблема... Все реализуемо...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 4.07.2007 19:20) *
А зачем?
когда-то хотел ради интереса, но практического применения не нашел... хотя нет, если я захочу сделать свой компилятор( lol.gif ), мне может это понадобится... но оставим это на потом...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #39


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


двигаюсь дальше появляются новые ошибки... в этот раз
Цитата
Only static variables can be used in static methods or outside methods
в методе
function getXMax():integer; //public
begin
getXMax:=high (map.a); //public a: array[0..10, 0..10] of integer;
end;
что делать?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


Гость






map это у тебя что? Не имя ли объекта? Если так, то нельзя обращаться к матрице в НЕклассовом методе через map.a, достаточно написать просто:

function getXMax(): integer;
begin
result := high(a);
end;
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.10.2020 3:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name