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

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Class, отличие от Object
сообщение
Сообщение #1


Я.
****

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

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


Какое отличие Class от Object ?

Вот здесь делаю одномерный массив объектом:
Модуль (Показать/Скрыть)

Программа (Показать/Скрыть)


Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Класс обязан инициализироваться конструктором всегда. Для Object это не так (если нет виртуальных методов - конструктор можно не вызывать). Так что добавь
Column := TColumn.Create;
и наслаждайся smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


mea culpa
*****

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

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


Сначала ж надо вызвать конструктор объекта:)

Класс - это такой тип данных. А объект - экземпляр класса.

Добавлено через 1 мин.
Чуть опоздал)


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Я.
****

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

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


Я уже Это пробовал после прочитки этой статьи http://e-dok.narod.ru/delphi/question1/opas/opas-004.html (других не нашел), не помогает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


mea culpa
*****

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

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


Так у тебя массив типа TYac, который является классом, следовательно, нужно вызывать конструктор для каждого элемента массива...


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Угу... Вот для этого и придумали конструкторы. Чтобы в момент конструирования TColumn тебе не пришлось заботиться о создании каждого элемента Col - сделай так:

Constructor TColumn.Create;
begin
Inherited Create;
for i := 1 to N do Col[i] := TCol.Create;
end;


Кстати, я бы заменил функции на property, чтоб было совсем хорошо smile.gif

  TYac = {object}class
private
Znac:integer;
public
property Value:integer read Znac write Znac;
end;

function TColumn.GetZnac(i:integer):integer;
begin
result := Col[i].Value;
end;
procedure TColumn.PutZnac(i,z:integer);
begin
Col[i].Value := z;
end;

Не проще?

Можно и еще дальше пойти, и GetZnaс/PutZnaс в классе TColumn тоже на свойство поменять.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Я.
****

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

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


Точно!
Спасибо.

Добавлено через 4 мин.
Я сделал именно так)))
constructor TColumn.Create;
var i:integer;
begin
inherited;
for i:=1 to N do
Column[i]:=TYac.Create;
end;

Только вместо Inherited Create; написал просто Inherited; . Какая между этими вариантами разница?


Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Никакой разницы в данном случае не будет. Я обычно добавляю имя конструктора, хотя этого можно и не делать.
Цитата
Без параметров Inherited вызывает так же названный метод родительского класса, с теми же самыми параметрами.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Я.
****

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

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


Пробую сделать свойствами:
type
TCell = class
private
fValue:integer;
function GetValue:integer;
procedure PutValue(v:integer);
published
property Value:integer read GetValue write PutValue;
end;


implementation

function TCell.GetValue:integer;
begin
result:=Value;
end;

procedure TCell.PutValue(v:integer);
begin
Value:=v;
end;

end.

Программа зависает. И когда
function GetValue:integer;
procedure PutValue(v:integer);

ставлю в private, то вне модуля их не видно, а свойство Value видно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
Программа зависает.
Показывай, как вызываешь...

Цитата
ставлю в private, то вне модуля их не видно, а свойство Value видно.
Ну, это там и должно быть. Private - он на то и приватный, чтобы не быть видимым извне. Только изнутри. А Value у тебя published, поэтому и видимое отовсюду.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Ух ты... Сразу не заметил... Ты чего ж делаешь?
function TCell.GetValue:integer;
begin
result:=fValue; // <-- У тебя был бесконечный рекурсивный вызов самого себя
end;
procedure TCell.PutValue(v:integer);
begin
fValue:=v; // <--- Аналогично
end;


Ты же с помощью Геттера/Сеттера должен обращаться к полю, а не к свойству. А свойство работает через Геттер/Сеттер, а не напрямую с полем. Понимаешь, в чем преимущество? Вот ты сам написал, что методы GetValue/PutValue невидимы, так? И поле fValue тоже невидимо. Но в то же время свойство-то видимо, и обращаешься ты через него к невидимому полю посредством невидимой же функции.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

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

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


Про то что можно описывать Object я даже и не знал... везде видел только class wacko.gif
а про то что свойство можно вызывать рекурсивно - вообще не знал smile.gif

Добавлено через 2 мин.
Цитата
А свойство работает через Геттер/Сеттер, а не напрямую с полем
Это ведь в данном случае, так как свойство описано с помощью процедуры и функции ?

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
Про то что можно описывать Object я даже и не знал...
Вообще-то использование Object-ов в Дельфи не рекомендуется. Это устаревший тип, который не изменяется еще с Дельфи 4, если не ошибаюсь. Рекомендуется использовать либо Class, либо расширенные записи (начиная с D2006 записи могут иметь конструкторы, методы, и умеют перегружать операции).

Object оставлен для совместимости (ох уж эта совместимость...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Я.
****

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

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


Модуль (Показать/Скрыть)

Программа (Показать/Скрыть)

Не работают закомментированые строчки. Насколько я понял, это происходит из-за того, что "Published свойства не могут возвращать массивы." , а Publiс не видны "родственникам по программе" дальше чем потомки данного класса.

Добавлено через 8 мин.
Извините, забыл. Задание: Найти произведение матриц.

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






А может причина-таки в другом? Я ж говорил тебе, что каждый экземпляр класса должен быть создан. Вот и создавай:
function TFunc.Mult(a,b:TMatr;N:byte):TMatr;
var
i,j,s:byte;
v:integer;
begin
result := TMatr.Create; // <--- Вот это за тебя кто делать будет?

for i:=1 to N do
for j:=1 to N do
begin
v:=0;
for s:=1 to N do
begin
inc(v,a.Row[i].Column[s].Value*b.Row[s].Column[j].Value);
result.Row[i].Column[j].Value:=v; // <--- Чего тут у тебя не работало, говоришь?
end;
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Я.
****

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

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


Да.. blink.gif Не ожидал. good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






sheka
Ты думаешь это все, чего можно добиться Свойствами? Ошибаешься. Опиши оба свойства (и Column в классе TColumn, и Row в классе TRow) как Default, и тогда обращение к содержимому матрицы упростится:

function TFunc.Mult(a,b:TMatr;N:byte):TMatr;
var
i,j,s:byte;
v:integer;
begin
result := TMatr.Create;
for i:=1 to N do
for j:=1 to N do
begin
v:=0;
for s:=1 to N do
begin
// inc(v,a.Row[i].Column[s].Value*b.Row[s].Column[j].Value); // <---вот это
inc(v,a[i][s].Value*b[s][j].Value); // <--- Может выглядеть так
result[i][j].Value:=v; // <---
end;
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Я.
****

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

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


property Column[j:integer]:TCell read GetCell write SetCell; default;

Если свойство явно не вызывается, то считается что вызвано свойство с директивой default;?
Вот нашел книжечку там даже для меня достаточно понятно описана работа со свойствами(другие разделы не читал). А на русском такой нет?

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






А можно ссылку поправить? А то она у тебя какая-то усеченная, с многоточием в середине...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Я.
****

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

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


Исправил.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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