Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-80248
_none_
2004-02-03 20:04
2004.02.25
электрический самокат


3-79669
Vic
2004-01-30 17:21
2004.02.25
Типы данных в Access


7-80324
big_bugzy
2003-12-04 14:53
2004.02.25
Как получить список всех DialUp соеденений которые есть на компе?


1-79990
Sergei!
2004-02-13 11:59
2004.02.25
TComboBoxEx.Indent не работает


3-79636
gedd
2004-01-31 18:08
2004.02.25
Разделение полей в тектовой базе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский