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

Форум для изучающих FPC и их учителей.

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

Ответить
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5717
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

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

Сообщение Лекс Айрин »

создаю класс, для проверки создаю две кнопки создания/удаления объекта класса. Вроде бы все понятно, но выдает ошибку при создании объекта. Отключение отладчика/смена оси и версии компилятора не играет никакой роли.

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

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.

Последний раз редактировалось Лекс Айрин 12.11.2013 20:18:00, всего редактировалось 1 раз.
NTFS
постоялец
Сообщения: 388
Зарегистрирован: 05.11.2007 13:57:50
Откуда: Краснодар
Контактная информация:

Сообщение NTFS »

Зачем так? Не проще ли

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

var T:TToken

T:=TToken.Create

T.GetToken

T.Free
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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


В делфи объявление вида

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

Token = class


уже ссылка (указатель).
Правильно так

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

T:=Token.Create;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5717
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

NTFS,Mikhail, спасибо вроде бы заработало.

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


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

Да и динамическое создание объектов понадобится. Причем, в этом же проекте.
zub
долгожитель
Сообщения: 2894
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Раз уж вам хочется доступ через дополнительный указатель, то незабываем выделять память.
замените

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

T^.Create;

на

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

getmem(t,sizeof(pointer));
T^:=Token.create;

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

Как тут уже заметили переменная типа класс уже указатель, а память под инстанс класса всерано выделяется в куче.
Такие "выкрутасы" нужны при работе с object, c class можно обойтись без них
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5717
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub. не то, что хочется... просто классы, использующие данный, являются динамическими структурами.

А работа с помощью new/dispose получается, невозможна?
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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


Зачем? Объект уже динамическая переменная. Создается он с помощью конструктора, а разрушается с помощью деструктора. Только не путайте class и object.
zub
долгожитель
Сообщения: 2894
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

>>zub. не то, что хочется...
если я правильно понимаю что хочется, то лучше юзать object`ы а не class`ы
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5717
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail писал(а):Только не путайте class и object.


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

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


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

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