![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
sheka |
![]()
Сообщение
#1
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Какое отличие Class от Object ?
Вот здесь делаю одномерный массив объектом: Модуль (Показать/Скрыть)
Программа (Показать/Скрыть)
Сообщение отредактировано: sheka - 28.03.2010 15:07 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Класс обязан инициализироваться конструктором всегда. Для Object это не так (если нет виртуальных методов - конструктор можно не вызывать). Так что добавь
Column := TColumn.Create;
и наслаждайся ![]() |
Unconnected |
![]()
Сообщение
#3
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Сначала ж надо вызвать конструктор объекта:)
Класс - это такой тип данных. А объект - экземпляр класса. Добавлено через 1 мин. Чуть опоздал) -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
sheka |
![]()
Сообщение
#4
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Я уже Это пробовал после прочитки этой статьи http://e-dok.narod.ru/delphi/question1/opas/opas-004.html (других не нашел), не помогает.
|
Unconnected |
![]()
Сообщение
#5
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Так у тебя массив типа TYac, который является классом, следовательно, нужно вызывать конструктор для каждого элемента массива...
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Угу... Вот для этого и придумали конструкторы. Чтобы в момент конструирования TColumn тебе не пришлось заботиться о создании каждого элемента Col - сделай так:
Constructor TColumn.Create;
begin
Inherited Create;
for i := 1 to N do Col[i] := TCol.Create;
end;
Кстати, я бы заменил функции на property, чтоб было совсем хорошо ![]() 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 тоже на свойство поменять. |
sheka |
![]()
Сообщение
#7
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Точно!
Спасибо. Добавлено через 4 мин. Я сделал именно так))) constructor TColumn.Create;
var i:integer;
begin
inherited;
for i:=1 to N do
Column[i]:=TYac.Create;
end;
Только вместо Inherited Create; написал просто Inherited; . Какая между этими вариантами разница? Сообщение отредактировано: sheka - 28.03.2010 15:57 |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Никакой разницы в данном случае не будет. Я обычно добавляю имя конструктора, хотя этого можно и не делать.
Цитата Без параметров Inherited вызывает так же названный метод родительского класса, с теми же самыми параметрами. |
sheka |
![]()
Сообщение
#9
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Пробую сделать свойствами:
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 видно. |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Программа зависает. Показывай, как вызываешь...Цитата ставлю в private, то вне модуля их не видно, а свойство Value видно. Ну, это там и должно быть. Private - он на то и приватный, чтобы не быть видимым извне. Только изнутри. А Value у тебя published, поэтому и видимое отовсюду. |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Ух ты... Сразу не заметил... Ты чего ж делаешь?
function TCell.GetValue:integer;
begin
result:=fValue; // <-- У тебя был бесконечный рекурсивный вызов самого себя
end;
procedure TCell.PutValue(v:integer);
begin
fValue:=v; // <--- Аналогично
end;
Ты же с помощью Геттера/Сеттера должен обращаться к полю, а не к свойству. А свойство работает через Геттер/Сеттер, а не напрямую с полем. Понимаешь, в чем преимущество? Вот ты сам написал, что методы GetValue/PutValue невидимы, так? И поле fValue тоже невидимо. Но в то же время свойство-то видимо, и обращаешься ты через него к невидимому полю посредством невидимой же функции. |
Client |
![]()
Сообщение
#12
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Про то что можно описывать Object я даже и не знал... везде видел только class
![]() а про то что свойство можно вызывать рекурсивно - вообще не знал ![]() Добавлено через 2 мин. Цитата А свойство работает через Геттер/Сеттер, а не напрямую с полем Это ведь в данном случае, так как свойство описано с помощью процедуры и функции ?Сообщение отредактировано: Client - 28.03.2010 20:42 |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата Про то что можно описывать Object я даже и не знал... Вообще-то использование Object-ов в Дельфи не рекомендуется. Это устаревший тип, который не изменяется еще с Дельфи 4, если не ошибаюсь. Рекомендуется использовать либо Class, либо расширенные записи (начиная с D2006 записи могут иметь конструкторы, методы, и умеют перегружать операции). Object оставлен для совместимости (ох уж эта совместимость...) |
sheka |
![]()
Сообщение
#14
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Модуль (Показать/Скрыть)
Программа (Показать/Скрыть)
Не работают закомментированые строчки. Насколько я понял, это происходит из-за того, что "Published свойства не могут возвращать массивы." , а Publiс не видны "родственникам по программе" дальше чем потомки данного класса. Добавлено через 8 мин. Извините, забыл. Задание: Найти произведение матриц. Сообщение отредактировано: sheka - 28.03.2010 22:48 |
volvo |
![]()
Сообщение
#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;
|
sheka |
![]()
Сообщение
#16
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Да..
![]() ![]() |
volvo |
![]()
Сообщение
#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;
|
sheka |
![]()
Сообщение
#18
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
property Column[j:integer]:TCell read GetCell write SetCell; default;
Если свойство явно не вызывается, то считается что вызвано свойство с директивой default;? Вот нашел книжечку там даже для меня достаточно понятно описана работа со свойствами(другие разделы не читал). А на русском такой нет? Сообщение отредактировано: sheka - 29.03.2010 15:52 |
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
А можно ссылку поправить? А то она у тебя какая-то усеченная, с многоточием в середине...
|
sheka |
![]()
Сообщение
#20
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Исправил.
|
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 6:39 |