Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование class var в объекте, реализующим интерфейс / 4 сообщений из 4, страница 1 из 1
02.07.2018, 15:13
    #39668391
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование class var в объекте, реализующим интерфейс
Здравствуйте!

Не могу понять, почему возникает ошибка Invalid pointer operation.

Есть интерфейс и класс, отнаследованный от TInterfacedObject, этот интерфейс реализующий (для простоты возьмем пустой интерфейс без методов):

interface
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  ISomeInterface = interface
  end;

  TSomeClass = class(TInterfacedObject, ISomeInterface)
  private
    //class var FCount: integer;
    FSomeObject: TObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;




У этого класса есть поле-объект, создаваемое в конструкторе и уничтожаемое в деструкторе:

implementation
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
constructor TSomeClass.Create;
begin
  inherited;
  FSomeObject := TObject.Create;
end;

destructor TSomeClass.Destroy;
begin
  FSomeObject.Free;
  inherited;
end;




Используется примерно так:

implementation
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function CreateSomeInterface: ISomeInterface;
begin
  Result := TSomeClass.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Obj1, Obj2: ISomeInterface;
begin
  Obj1 := CreateSomeInterface;
  Obj2 := CreateSomeInterface;
  try
    {}
  finally
    Obj1 := nil;
    Obj2 := nil;
  end;
end;




В таком виде ошибки не будет.

Если расскоментировать //class var FCount: integer; то возникает Invalid pointer operation.
...
Рейтинг: 0 / 0
02.07.2018, 15:18
    #39668397
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование class var в объекте, реализующим интерфейс
nicholaos,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  ISomeInterface = interface
  end;

  TSomeClass = class(TInterfacedObject, ISomeInterface)
  private
    class var
     FCount: integer;
    var
     FSomeObject: TObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;
...
Рейтинг: 0 / 0
02.07.2018, 15:23
    #39668399
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование class var в объекте, реализующим интерфейс
Kazantsev Alexey,

Спасибо! Думал модификатор class var работает только на 1 строку...
...
Рейтинг: 0 / 0
02.07.2018, 15:33
    #39668405
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование class var в объекте, реализующим интерфейс
nicholaosДумал модификатор class var работает только на 1 строку...Чтобы не думать, нужно просто определять разные куски класса в разных секциях
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  TSomeClass = class(TInterfacedObject, ISomeInterface)
  private
    type
      TMyType = ......
  private
    class var
      FCount: integer;
  private
     FSomeObject: TObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование class var в объекте, реализующим интерфейс / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]