Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2018, 20:34   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию class vs object

Приветствую. Не думал, что буду спрашивать о Delphi... Но тем не менее.

Создаю класс
Код:
Type Complex = class
private
  Re : real;
  Im : real;

public
  constructor Create(); overload;
  constructor Create(A : real; B : real); overload;
  constructor Create(C : Complex); overload;
  destructor Dispose();
  function Add(A : Complex; B : Complex) : Complex;
end;
Вопросы:
1) class это просто наследник TObject ?
2) Можно ли перегрузить операторы, например +, := и т.д. В манах сказано, что только для структур. Зачем тогда вообще эти классы нужны?
3) Зачем писать ключевые слова constructor/destructor, если они автоматически не вызываются, как в C++, например.
4) Где будет создан объект: в стеке или в динамической памяти?
Код:
//Основное тело проги. Аналог main()
var C : Complex;
begin
  C := Complex.Create();
end.
5) Можно ли создать объект с помощью оператора new()? Ругается на
Код:
A := new(PComplex, Create(1,1));
Потом вспомнил студенчество и программирование на Паскале. Там класс определялся ключевым словом object. После замены class на object в вышеприведенном коде начинаю сыпаться ошибки. Соответственно идет ругань на вызов конструктора внутри метода класса. Например:
Код:
function Complex.Add(A : Complex; B : Complex) : Complex;
begin
  Add := Complex.Create(A.Re + B.Re, A.Im + B.Im);
  WriteLn('Add');
end;
В связи с этим, следующие вопросы
6) Можно ли вызвать конструктор или каким-либо иным образом создать новый объект внутри метода класса?
7) Также ругань идет на перегруженный конструктор:
Код:
A := new(PComplex, Create(10, 20));
Можно ли использовать конструкторы с тем же именем, или каждый конструктор должен носить уникальное имя?
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 21.04.2018, 20:43   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Зачем писать ключевые слова constructor/destructor, если они автоматически не вызываются, как в C++, например.
Ну они ж все равно особенные.
конструкторы например указатель на созданный объект возвращают.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.04.2018, 21:12   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Complex = class и Complex = class(TObject) равносильно
Экземпляр класса, другими словами объект, создается в динамической памяти
new для создания объекта ни разу
конструкторы могут быть одно и разноименными
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.04.2018 в 21:20.
Аватар вне форума Ответить с цитированием
Старый 21.04.2018, 21:24   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Sam Gold
Цитата:
Сообщение от Sam Gold Посмотреть сообщение
1) class это просто наследник TObject ?
Так точно.

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
2) Можно ли перегрузить операторы, например +, := и т.д. В манах сказано, что только для структур. Зачем тогда вообще эти классы нужны?
Оператор присвоения. Можно было перезагружать и раньше для классов. А вот остальные операторы только для структур. Классы нужны для наследования и создания динамических объектов - проще говоря на классах весь VCL держится.

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
3) Зачем писать ключевые слова constructor/destructor, если они автоматически не вызываются, как в C++, например.
Это наследство BP7. constructor нужен для выделения памяти и вызова счетчика ссылок.

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Где будет создан объект: в стеке или в динамической памяти?
В динамической. На стеке только структуры.

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Можно ли создать объект с помощью оператора new()? Ругается на
Объект класс создать при помощи new нельзя.
Если хотите создать
C := Complex.Create(10,10);

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Потом вспомнил студенчество и программирование на Паскале. Там класс определялся ключевым словом object. После замены class на object в вышеприведенном коде начинаю сыпаться ошибки. Соответственно идет ругань на вызов конструктора внутри метода класса. Например:
Object сохраняется как атавизм, и пользоваться им не рекомендую.
Так для object как раз через new надо создавать. А потом вызывать Init(10,10) соответственно конструктор надо будет переписать на procedure init(A : real; B : real);

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Можно ли использовать конструкторы с тем же именем, или каждый конструктор должен носить уникальное имя?
Может начиная с D5.


Цитата:
Сообщение от Sam Gold Посмотреть сообщение
6) Можно ли вызвать конструктор или каким
Код:
Type TComplex = class
private
  Re : real;
  Im : real;

public
  constructor Create(); overload;
  constructor Create(A : real; B : real); overload;
  constructor Create(C : TComplex); overload;
  destructor Dispose();
  function Add(A , B: TComplex) : TComplex;
end;

function TComplex.Add(A, B: TComplex): TComplex;
begin
Result:=TComplex.Create;
Result.Re:=A.Re+B.Re;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 21.04.2018, 21:39   #5
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Pavia, спасибо за развернутый ответ!

Цитата:
Оператор присвоения. Можно было перезагружать и раньше для классов.
А как? оператор Implicit перегружать?

Вопросы 6 и 7 касались ситуации когда Complex объявлен как object.
Код:
Type Complex = class
private
  Re : real;
  Im : real;

public
  constructor Create(); overload;
  constructor Create(A : real; B : real); overload;
  constructor Create(C : Complex); overload;
Т.е.
6) Можно ли вызвать конструктор или каким-либо иным образом создать новый объект внутри метода класса (type Complex = object ...)
7) Можно ли иметь в object несколько перегруженных конструкторов и передавать их в new ?
Код:
A := new(PComplex, Create(10, 20));
8) Кстати, если Complex это object, то где будет располагаться C? Тоже в хипе?

Код:
var A : PComplex; C : Complex

begin
A := new(PComplex, Create(10, 20));
C := A^;
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 21.04.2018, 22:39   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
8) Кстати, если Complex это object, то где будет располагаться C? Тоже в хипе?
Тут С будет в стеке.

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
7) Можно ли иметь в object несколько перегруженных конструкторов и передавать их в new ?
У object нет конструкторов вообще. Поэтому никак нельзя.
Код:
 PComplex=^TComplex;
  TComplex=object
   Re,Im:Real;
   procedure init(x,y:Real);
   end;
...
A := new(PComplex);
A.Init(10,10);

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Можно ли вызвать конструктор или каким-либо иным образом создать новый объект внутри метода класса (type Complex = object ...)
Странный вопрос. Это не Си, дельфи автоматически не вызывает конструктор.
А внутри метода можете вызывать сколько надо.
Код:
  TFoo=class
  ...
  end;
  
  TBoo=object
   Foo:TFoo;
   procedure init;
  end;

procedure TBoo.init;
begin
 Foo:=TFoo.Create;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 22.04.2018, 00:16   #7
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
У object нет конструкторов вообще. Поэтому никак нельзя.
Пардон, как это? А что же тогда передается в оператор new? Delphi там хочет видеть только то,что помечено словом constructor.
Код:
A := new(PComplex, Create(10, 20));
Если туда передавать процедуру, то начнется ругань.

Код:
A := new(PComplex);
A.Init(10,10);
Ну если таким образом инициализировать объект, то да

Я имел ввиду, можно ли как-то исхитрится в такой конструкции и
Код:
Type Complex = object
private
  Re : real;
  Im : real;

public
  constructor Create(); override;
  constructor Create(A : real; B : real); override;
  constructor Create(C : Complex); override;
end;
чтобы не ругалось на
Код:
A := new(PComplex, Create(10, 20));
Цитата:
Сообщение от Pavia Посмотреть сообщение
Это не Си, дельфи автоматически не вызывает конструктор.
Ну C тоже не вызывает, конструкторы же в плюсах Автоматически не вызываются конструкторы, при уничтожении объекта в стеке автоматически не вызываются деструкторы... Довольно странно, что они вынесены в отдельные сущности, можно же было тогда позволить в new указатель на соответствующую функцию пихать. (Да, это камушек в огород Pascal и Delphi)

Цитата:
Сообщение от Pavia Посмотреть сообщение
А внутри метода можете вызывать сколько надо.
В Вашем примере с class и object да. А вот если есть только object. И внутри одного из методов этого object надо вызвать конструктор.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 22.04.2018, 02:47   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Я имел ввиду, можно ли как-то исхитрится в такой конструкции и
Пишите программу на Паскале и используйте Паскалевский компилятор. И да прибудет вам "щасте". На Дельфи так делать нельзя.
northener вне форума Ответить с цитированием
Старый 22.04.2018, 03:11   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Что за бред я только что прочитал?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.04.2018, 17:33   #10
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Спасибо отписавшимся по делу.
Цитата:
Сообщение от northener Посмотреть сообщение
Пишите программу на Паскале и используйте Паскалевский компилятор. И да прибудет вам "щасте". На Дельфи так делать нельзя.
По условию задачи надо на Дельфях, но с синтаксисом Паскаля. Сам я сними не работал, но знакомый попросил объяснить работу с объектами в Делфи, и что-то это уже не кажется мне простой задачей. У них в универе до сих пор (sic!!!) преподают Паскаль, но поскольку он под новыми осями запускается только с танцами с бубном перешли на Делфи, плюс, рассказывают про пару простеньких фич, реализованных в Дельфях.
Цитата:
Сообщение от min@y™ Посмотреть сообщение
Что за бред я только что прочитал?
Очень информативно и по делу.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в чем отличие class от object? illuminates Общие вопросы Delphi 8 06.06.2012 15:21
Ошибка при подключении к базе данных Object reference not set to an instance of an object. lowercase ASP.NET 1 20.11.2011 22:48
Отличие type T = Object от type T = Class? Warn Общие вопросы Delphi 8 04.11.2011 19:20
Ошибка " Record, object or class type required " (Запись, объектный или классический тип требовались) kta87 Помощь студентам 2 28.02.2010 10:04
Record, object or class type required @mazonk@ Помощь студентам 0 07.06.2009 13:03