Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 class constructor: Undeclared identifier: 'Self'  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
type
  TMyClass = class
  public
    class constructor Create;
  end;

procedure Process(AClass: TClass);
begin

end;

class constructor TMyClass.Create;
begin
  Process(Self);
end;


Что я делаю не так?
13 май 18, 19:32    [21406632]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 58929
SOFT FOR YOU> Что я делаю не так?

Либо не к месту пытаешься юзать Self, либо не к месту пытаешься впихнуть
class constructor вместо обычного, не понимая его суть, для чего он и отличия.
13 май 18, 19:41    [21406635]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2681
SOFT FOR YOU,

В классовых конструкторах нет инстанса. То есть селфа. Собственно - в том и разница с обычными:

https://stackoverflow.com/questions/39471864/delphi-constructor-and-class-constructor

A class constructor executes exactly once, when the unit in which it is declared is initialized. A class constructor is a static class method, and so Self is not defined.
A constructor executes when explicitly called and has the job of initializing an instance of a class.
13 май 18, 19:43    [21406637]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 58929
makhaon> https://stackoverflow.com/questions/39471864/delphi-constructor-and-class-constructor

Это не совсем корректная ссылка (в т.ч. по тексту), оф.дока лучше:
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Methods#Class_Constructors

Posted via ActualForum NNTP Server 1.5

13 май 18, 19:50    [21406640]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
чё???
Guest
+
program console;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;


type
  PMyClass = ^TMyClass;

  TMyClass = class
  class var
    str1: string;

  public

    class constructor Create;

  end;

procedure Process(AClass: TMyClass);
begin
  Writeln(AClass.str1);
end;

class constructor TMyClass.Create;
begin
  str1 := 'tyjy';

  Process(TMyClass(NativeInt(TMyClass)));
end;

var
  t: TMyClass;

begin
  try
    t := TMyClass.Create;
    Writeln(t.ToString);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
13 май 18, 20:08    [21406644]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
Чё???
Guest
Process(nil);


так тоже работает. они же в памяти класса эти переменные. статически
13 май 18, 20:12    [21406645]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1856
SOFT FOR YOU
Что я делаю не так?
Это розыгрыш?
13 май 18, 22:52    [21406813]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
DimaBr
Member

Откуда:
Сообщений: 10600
self - указатель на экземпляр. Классовые методы - методы работающие без создания экземпляра.
14 май 18, 00:39    [21406882]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Век живи, век учись
Я думал class var/class property/class constructor - вещи, которые характерны как для самого класса, так и для его потомков. На каждый класс своя копия переменных
Оказывается, всё это статические вещи и находятся только в том классе, где объявлены :(

Всем спасибо
14 май 18, 00:58    [21406894]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2681
SOFT FOR YOU,

Общие поля/методы для экземпляров - это обычные. Общие методы/поля для всего класса - это классовые. Обращаться из экземпляров можно к любым. Но в классовых методах и полях нет экземпляров. Иначе они были бы не классовыми а обычными. Вроде же всё прозрачно?
14 май 18, 12:02    [21407672]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
alekcvp
Member

Откуда:
Сообщений: 1059
DimaBr
self - указатель на экземпляр. Классовые методы - методы работающие без создания экземпляра.

Не совсем так. В классовых методах Self - указатель на класс. Т.е. такой код рабочий:
...
class function TSomeClass.NewClassInstance: TSomeClass;
begin
  Result := Self.Create; // код только для примера.
end;


Видимо, классовые конструкторы в этом плане тоже особенные.
14 май 18, 13:09    [21407915]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1085
В справке же все расписано
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Methods_(Delphi)#Class_Constructors

По сути это замена глобального initialization, на более конкретные для класса.
14 май 18, 13:23    [21407973]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10450
alekcvp
В классовых методах Self - указатель на класс
alekcvp
Не совсем так.
alekcvp
Т.е. такой код рабочий:

А такой нерабочий
type
  TSomeClass = class
    class function NewClassInstance: TSomeClass;  static;
  end;

class function TSomeClass.NewClassInstance: TSomeClass;
begin
  Result := Self.Create; // код только для примера.
end;
14 май 18, 14:10    [21408155]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10450
X-Cite
По сути это замена глобального initialization, на более конкретные для класса.
По сути это вызов инициализации только тогда, когда линкер линкует конкретный класс, а не при любом упоминании модуля в uses
14 май 18, 14:12    [21408161]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
alekcvp
Member

Откуда:
Сообщений: 1059
_Vasilisk_
А такой нерабочий
[/src]

И при чём тут это. Речь была о том, что Self - не всегда указатель на инстанс и в классовых методах он тоже присутствует. При чем тут static методы?
14 май 18, 15:30    [21408525]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10450
alekcvp
При чем тут static методы?
При том, что это тоже классовые методы
14 май 18, 15:42    [21408568]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
alekcvp
Member

Откуда:
Сообщений: 1059
_Vasilisk_
alekcvp
При чем тут static методы?
При том, что это тоже классовые методы

По-факту это просто отдельные процедуры, приписанные к классу для удобства, так как ничего именно "классового" в них нет.
14 май 18, 16:19    [21408704]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1085
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Methods_(Delphi)#Class_Static_Methods

Все есть в справке.
14 май 18, 18:23    [21409075]     Ответить | Цитировать Сообщить модератору
 Re: class constructor: Undeclared identifier: 'Self'  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1085
автор
class static methods have no Self parameter at all
14 май 18, 18:24    [21409077]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить