Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизОшибка при приведении объекта к типу предка Найти похожие ветки
← →
AkaSaint (2004-02-11 18:30) [0]Здравствуйте. Есть такая система классов:
type
A = class(SomeClass)
public
Field1: Integer;
...
end;
B = class(A)
public
...
end;
BArray = array of B;
C = class(SomeClass)
public
BArr: BArray;
...
end;
Где-то в программе:
var
AObj: A;
begin
...
for i := 0 to Length(C.BArr) do
begin
//Здесь отладчик показывает: C.BArr[0].Field1=5
AObj := C.BArr;
//Здесь отладчик показывает: C.BArr[0].Field1=5
//AObj.Field1 = 0
...
end;
...
end;
Причем, если поставить в отладчике тип C.BArr[0] и AObj как
указатель, то адреса их совпадают.
В чем может быть дело? Заранее спасибо.
← →
Тимохов (2004-02-11 18:32) [1]
> AObj := C.BArr;
Это что?
← →
Тимохов (2004-02-11 18:33) [2]
> for i := 0 to Length(C.BArr) do
баг
← →
Тимохов (2004-02-11 18:33) [3]и вообще, где ошибка?
← →
Vlad (2004-02-11 18:40) [4]
> AkaSaint © (11.02.04 18:30)
> C = class(SomeClass)
>public
>BArr: BArray;
.....
> for i := 0 to Length( C.BArr) do
Это как ? :-)
← →
icWasya (2004-02-11 19:04) [5]???
1)
for i := 0 to Length(C.BArr) -1 do
2)
в предыдущей строке С это тип или что?
← →
Тимохов (2004-02-11 19:06) [6]Я знаю это была проверка отывчивости участников форума.
Автор куда-то делся - наверное домой пошел.
← →
AkaSaint (2004-02-12 15:10) [7]Нет, это не проверка, конечно, просто потом у меня не было времени. Прошу меня извинить.
В программе я неверно написал "C", под этим имелся в виду объект класса С. Перепишу заново, надеюсь, на этот раз все учел.
type
A = class(SomeClass)
public
Field1: Integer;
...
end;
B = class(A)
public
...
end;
BArray = array of B;
C = class(SomeClass)
public
BArr: BArray;
...
end;
Где-то в программе:
var
AObj: A;
CObj: C;
begin
...
CObj := C.Create;
...
for i := 0 to Length(CObj.BArr)-1 do
begin
//Здесь отладчик показывает: CObj.BArr[0].Field1=5
AObj := CObj.BArr;
//Здесь отладчик показывает: CObj.BArr[0].Field1=5
//AObj.Field1 = 0
...
end;
...
end;
Смысл ошибки в том, что поля AObj содержат не те значения, что содержит CObj.BArr[0], хотя первый является предком последнего.
← →
Тимохов (2004-02-12 15:12) [8]Все-таки не очень ясно, что такое AObj := CObj.BArr;
У тебя это вообще компилится?
← →
MBo (2004-02-12 15:13) [9]А так?
AObj := CObj.BArr[0];
← →
Тимохов (2004-02-12 15:17) [10]
> MBo © (12.02.04 15:13) [9]
Да вообще говоря у него это (AObj := CObj.BArr) компилиться просто не должно. имхо
← →
Chieftain (2004-02-12 15:34) [11]Собственно, оно и не компилится ;) Incompatible types
← →
Тимохов (2004-02-12 15:35) [12]Тогда что вообще на код, который не компилиться?
Эй, автор - проясни ситуацию.
← →
Семен Сорокин (2004-02-12 15:48) [13]2AkaSaint
наследуюй от TPersistent, где перекрывай Assign.
Посмотри как это сделано в том же TFont.
← →
AkaSaint (2004-02-12 19:40) [14]Опять не все учел! Должно быть AObj := CObj.BArr[0]. Насчет TPersistent: SomeClass есть потомок TPersistent, и Assign там перекрыт. Я пробовал так:
AObj := A.Create;
AObj.Assign(CObj.BArr[0]);
Я посмотрел на TFont.Assign, я делаю аналогично. Но уже на первой строчке A.Assign Source=nil, хотя CObj.BArr[0] <> nil!
← →
Тимохов (2004-02-12 19:46) [15]Как говорится на местном формуме - ошибка в 17 строке. В приседенном в 7 коде с учетом 14 ошибки нет.
← →
Defunct (2004-02-13 01:33) [16]В программе AObj это указатель на экземпляр класса A
[14]
AObj := A.Create;
AObj.Assign(CObj.BArr[0]);
Создается новый экзнемпляр, ему назначается читаем Delphi Help
The Assign method copies all properties from a Series component to another. Все свойства из CObj.BArr[0], но Field один это не Property!! отсюда и получается 0 в отладчике.
Нужно просто присвоить:
AObj := CObj.BArr[0];
Тогда AObj будет ссылкой на экземпляр CObj.BArr[0];
Или описать Field1 как Property
← →
Тимохов (2004-02-13 09:56) [17]
> Defunct (13.02.04 01:33) [16]
Немножко не в ту степь.
"The Assign method copies all properties from a Series component to another"
Это будет не автоматически, а если самому описать копирование.
"Или описать Field1 как Property" - это вообще к чему. Что это решит проблему?
В исходном коде ошибки нет. Все дожно работать не зависимо от property это или нет.
← →
Defunct (2004-02-13 10:41) [18]Вызывается ведь Assign из (SomeClass), вот поля SomeClass и копируются
← →
Тимохов (2004-02-13 10:42) [19]
> Defunct (13.02.04 10:41) [18]
Само ничего не копируется - надо явно описать алгоритм копирования.
← →
AkaSaint (2004-02-13 16:35) [20]Ладно, придется пока оставить этот вопрос. Спасибо всем.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.03 c