указатель на класс

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

указатель на класс

Сообщение Михаил » 15.01.2007 18:00:17

Гритингс!
что-то я всё не могу понять систему работы с классами

есть такая иерархия классов
Код: Выделить всё
  TBase = class
  private   
  protected
    FName:String;
    FID:integer;
    FType:TInterfaceBase;
  public
  end;

  TTributarBase = class (TBase)
  private
  protected
    FRx,FTx:TBase; //исп. как указатель либо на TTributarBase, либо на TVCBase
  public
  end;

  TVCBase = class(TBase)
  private
  protected
    FMember:TBase;  //исп. как указатель
  public
  end;

  TSTM1 = class
  private
    ...
  protected
    FVCRx: array [0..62] of TVCBase; //эти классы все создаются
    FVCTx: array [0..62] of TVCBase; //эти классы все создаются
  public
  end;

  TLine = class
  private
    ...
    FSTM1:TSTM1;//создаётся класс
    ...
  public
  end;

  TCross = class
  private
    FLineA,FLineB:TLine;//тоже создаётся
  public
  end;


вопрос в струдию!!!
у нас допустим дан элемент FBase от TBase, по элементу FType в нём нам известно что он отностился к одному из... либо FLineA, либо FLineB
есть указатель aLine:TLine;

получаем указатель на соответствующий класс
aLine:=TLine(FBase)

при обращении к методу либо свойству класса всё работает номально
i:=aLine.ID

но если сделать так, то вылетает
i:=aLine.FSTM1.FVCRx[5].ID
Аватара пользователя
Михаил
новенький
 
Сообщения: 13
Зарегистрирован: 31.10.2006 14:27:31

Сообщение ZerstoreN » 15.01.2007 19:22:23

Что-то не воткнул, где автор получает указатель на класс, похоже речь идет об экземплярах?
"класс создается" - имеется в виду что до использования было сделано что-то вроде
FLineA := TLine.Create; ?
и что такое .ID, кстати?
ZerstoreN
новенький
 
Сообщения: 53
Зарегистрирован: 30.06.2006 12:05:01

Сообщение Михаил » 15.01.2007 22:25:43

ZerstoreN писал(а):Что-то не воткнул, где автор получает указатель на класс, похоже речь идет об экземплярах?
"класс создается" - имеется в виду что до использования было сделано что-то вроде
FLineA := TLine.Create; ?

ну как бы да

ZerstoreN писал(а):и что такое .ID, кстати?

свойство тако
Код: Выделить всё
  TBase = class
  private   
  protected
    FName:String;
    FID:integer;
    FType:TInterfaceBase;
  public
    property ID:integer write FID read FID;
  end;
...
...
...
constructor TCross.Create;
begin
  inherited Create; 
  FLineA:=TLine.Create;
  FLineA:=TLine.Create;
end;
...
...
...
constructor TLine.Create;
begin
  inherited Create; 
  FSTM1:=TSTM1.Cteate;
end;
...
...
...
constructor TSTM1.Create;
var i:integer
begin
  inherited Create; 
  for i:=0 to 62 do
  begin
    FVCRx[i]:=TVCBase.Create;
    FVCTx[i]:=TVCBase.Create;
  end;
  FSTM1:=TSTM1.Cteate;
end;
...
...
...
constructor TVCBase.Create;
begin
  inherited Create; 
  FMember:=nil;
end;
...
...
...
constructor TTributarBase.Create;
begin
  inherited Create; 
  FRx:=nil;
  FTx:=nil;
end;
Аватара пользователя
Михаил
новенький
 
Сообщения: 13
Зарегистрирован: 31.10.2006 14:27:31

Re: указатель на класс

Сообщение Михаил » 15.01.2007 22:38:19

Код: Выделить всё
procedure Form1.SetParam(Base:TBase);
var
  aLine:TLine;
  aVCBase:TVCBase;
  i:integer;
begin
  aLine:=TLine(Base);
  i:=aLine.ID; //так всё работает
...
  i:=aLine.FSTM1.FVCRx[5].ID;//при таком вызове происходит эксепшн, типа класса FSTM1 не существует
...
  aVCBase:=TVCBase(Base);//зато если так вызвать указатель на класс
  i:=aVCBase.ID;//то всё нормуль проходит
end;
Аватара пользователя
Михаил
новенький
 
Сообщения: 13
Зарегистрирован: 31.10.2006 14:27:31

Сообщение Sergei I. Gorelkin » 15.01.2007 22:56:35

Судя по коду, у Вас класс TLine не наследуется от TBase. Приведение типов в форме TLine(something) - это чисто синтаксическое выражение, никаких проверок не производится, поэтому если something на самом деле не является объектом класса TLine, результат будет непредсказуем. Что-то может даже случайно сработать, как у Вас ID.
Чтобы приведение типов выполнялось с проверкой, используют оператор as: MyLine := something as TLine;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Михаил » 15.01.2007 23:55:20

aLine:=Base as TLine

у мя пишет
Class or Object types "TBase" and "TLine" are not related

вообще посоветуйте что-нибудь для работы с классами почитать по-подробнее....... на русском желательно :)
Аватара пользователя
Михаил
новенький
 
Сообщения: 13
Зарегистрирован: 31.10.2006 14:27:31

Сообщение Михаил » 18.01.2007 07:33:38

Sergei I. Gorelkin писал(а):Приведение типов в форме TLine(something) - это чисто синтаксическое выражение, никаких проверок не производится, поэтому если something на самом деле не является объектом класса TLine, результат будет непредсказуем. [/b]


ну дело то в том, что он мне указатель на класс возвращает нормульный, но при попытке передвижения вниз по иерархии от этого указателя происходит эксепшн


и ещё вопрос!

у меня классы

TBase = class
end;

TVCBase = class(TBase)
end;

TTributatBase = class(TBase)
end;

TSTM1 = class
end;

находятся в одном модуле Unit1
а в Unit2 оставшиеся

TLine = class
end;

TCross = class
end;

который ссылается на Unit 1 за недостающими элементами....
так вот хотелось бы в классе типа TVCBase иметь ссылку на породивший его класс типа FLine:TLine; (тогда не придётся делать эти разъименования)
но при написании в Unit1 строчки

TLine = class;
компилятор пишет Error: Forward type not resolved "TLine"
что это такое может быть? так нильзя песать?
Аватара пользователя
Михаил
новенький
 
Сообщения: 13
Зарегистрирован: 31.10.2006 14:27:31


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru