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

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

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

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

Сообщение Лекс Айрин » 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.

Последний раз редактировалось Лекс Айрин 12.11.2013 20:18:00, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение NTFS » 12.11.2013 17:17:54

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

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

T:=TToken.Create

T.GetToken

T.Free
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

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

Сообщение Mikhail » 12.11.2013 17:19:14

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


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


уже ссылка (указатель).
Правильно так
Код: Выделить всё
T:=Token.Create;
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение Лекс Айрин » 12.11.2013 17:51:38

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

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


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

Да и динамическое создание объектов понадобится. Причем, в этом же проекте.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение zub » 12.11.2013 18:12:49

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

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

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

Как тут уже заметили переменная типа класс уже указатель, а память под инстанс класса всерано выделяется в куче.
Такие "выкрутасы" нужны при работе с object, c class можно обойтись без них
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Лекс Айрин » 12.11.2013 18:29:22

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

А работа с помощью new/dispose получается, невозможна?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Mikhail » 12.11.2013 18:33:27

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


Зачем? Объект уже динамическая переменная. Создается он с помощью конструктора, а разрушается с помощью деструктора. Только не путайте class и object.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение zub » 12.11.2013 18:43:55

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

>>zub. не то, что хочется...
если я правильно понимаю что хочется, то лучше юзать object`ы а не class`ы
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Лекс Айрин » 12.11.2013 18:44:54

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


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

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


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

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


Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru