Страница 1 из 1

[решено] создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 17:10:53
Лекс Айрин
создаю класс, для проверки создаю две кнопки создания/удаления объекта класса. Вроде бы все понятно, но выдает ошибку при создании объекта. Отключение отладчика/смена оси и версии компилятора не играет никакой роли.

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,Lexers;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  T:^Token;  // временный токен
  Form1: TForm1;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    memo1.Append('Запущен конструктор. root=');
    T^.Create;
    memo1.Append(T^.GetToken);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   memo1.Append('Запущен деструктор root=');
   T^.free;
    If T=nil then Memo1.Append('nil')
  else memo1.Append(T^.GetToken);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     memo1.Clear;
end;

end.                 


Код: Выделить всё
unit Lexers;

{$mode objfpc}{$H+}

interface

Type
 
//-------------------------класс Token--------------------------
  Token = class //(TObject)
   
    public
    Text:string;
    constructor Create; virtual;
    destructor Destroy;  override;
    Procedure SetToken (Str:String); virtual;// задать значение
    function GetToken:String; virtual;
  end;

implementation


//-----------------класс Token--------------------------
  Constructor Token.Create;
  Begin
    inherited Create;
    Text:='';

  End;
  Destructor Token.Destroy;
  Begin
    Text:='';
    Free;
  end;
  Procedure Token.SetToken(Str:String);
  Begin
    Text:=Str;
  End;
  Function Token.GetToken:String;
  Begin
    Result:=Text;
  end;

End.


Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 17:17:54
NTFS
Зачем так? Не проще ли

Код: Выделить всё
var T:TToken

T:=TToken.Create

T.GetToken

T.Free

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 17:19:14
Mikhail
Лекс Айрин писал(а):создаю класс, для проверки создаю две кнопки создания/удаления объекта класса. Вроде бы все понятно, но выдает ошибку при создании объекта. Отключение отладчика/смена оси и версии компилятора не играет никакой роли.


В делфи объявление вида
Код: Выделить всё
Token = class


уже ссылка (указатель).
Правильно так
Код: Выделить всё
T:=Token.Create;

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 17:51:38
Лекс Айрин
NTFS,Mikhail, спасибо вроде бы заработало.

NTFS писал(а):Зачем так? Не проще ли


Проще, конечно, но у меня не получилось :(

Да и динамическое создание объектов понадобится. Причем, в этом же проекте.

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 18:12:49
zub
Раз уж вам хочется доступ через дополнительный указатель, то незабываем выделять память.
замените
Код: Выделить всё
T^.Create;

на
Код: Выделить всё
getmem(t,sizeof(pointer));
T^:=Token.create;

и соответственно потом ее освобождать.

Как тут уже заметили переменная типа класс уже указатель, а память под инстанс класса всерано выделяется в куче.
Такие "выкрутасы" нужны при работе с object, c class можно обойтись без них

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 18:29:22
Лекс Айрин
zub. не то, что хочется... просто классы, использующие данный, являются динамическими структурами.

А работа с помощью new/dispose получается, невозможна?

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 18:33:27
Mikhail
Лекс Айрин писал(а):А работа с помощью new/dispose получается, невозможна?


Зачем? Объект уже динамическая переменная. Создается он с помощью конструктора, а разрушается с помощью деструктора. Только не путайте class и object.

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 18:43:55
zub
>>А работа с помощью new/dispose получается, невозможна?
проверте, я не пробовал, но думаю возможно... только вы не будете выделять память непоследственно под инстанс (хотя исхитриться можно), вы будете выделять память под указатель на инстанс.

>>zub. не то, что хочется...
если я правильно понимаю что хочется, то лучше юзать object`ы а не class`ы

Re: создание объекта. Что я делаю не так?

СообщениеДобавлено: 12.11.2013 18:44:54
Лекс Айрин
Mikhail писал(а):Только не путайте class и object.


Есть немного. Жалко только, что компилятор не останавливает в случае, когда хочется странного.

Добавлено спустя 2 минуты 3 секунды:
zub писал(а):если я правильно понимаю что хочется, то лучше юзать object`ы а не class`ы


Я подумаю над этим советом.

P.Script... советом воспользовался. Спасибо.