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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2013, 20:21   #1
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию Нужно ли использовать конструкторы/деструкторы для ОБЪЕКТОВ?

Здравствуйте.
Не знал, куда сунуться с этой темой, но мне чётко понятно, что моему нубскому вопросу самое месте в этом разделе.

Мне об этом, конечно, стыдно спрашивать, но всё же...

Решил я пофрилансить одну задачу (лаба для студента, 1 курс). В процесСе моего общения с заказчиком прозвучали такие реплики:

Цитата:
ЗАКАЗЧИК (23:18:36 4/05/2013)
сonstructor Create;
procedure Sort;
procedure tratata;
procedure p111;
procedure oppa;
Destructor Destroy;
end;

ЗАКАЗЧИК (23:18:44 4/05/2013)
вот стакой лабудой сможете сделать? )

ЗАКАЗЧИК (23:19:01 4/05/2013)
могу скинуть образец задачи суть такая жа
Имена процедур я изменил в интересах заказчика, хоть о конспирации он меня и не просил.

Он мне скинул примеры, откуда и были взяты выше указанные заголовки процедур. А задача, которую я решаю, имеет такую формулировку: "Разработать объект список..." дальше условие не пишу, так как ключевое слово уже названо - ОБЪЕКТ.

Те знания ООП, которые у меня имеются, говорят, что:
1. Конструктор и деструктор - это методы, которые используются для создания и разрушения объекта соответственно.
2. Объект - это экземпляр класса.
3. Объявив класс, мы не получим объект - его надо создать.

если я где-то ошибся, поправьте меня.

Ну, наконец скажу, что такой фрагмент кода:
Код:
type TT = object
			x: byte;
		  end;
		  
var
	A: TT;

begin

	A.x:=42;
	
	WriteLn(A.x);

end.
работает нормально и выдаёт число "42" как положено (тестировал в Делфи, Турбо и фри Паскаль), однако в образцах, которые прислал мне заказчик, конструкторы и деструкторы используются.

Вопрос у меня такой: Нужно ли использовать конструкторы/деструкторы для ОБЪЕКТОВ?
Заранее большое спасибо.
Вадим Мошев вне форума Ответить с цитированием
Старый 05.05.2013, 20:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
работает нормально и выдаёт число "42" как положено
Наверное потому что тут по факту не вызывается никакой конструктор, а вся работа идет с статическим полем икс. Вообще-то редкие случаи, но бывают. Я бы не надеялся не такой подарок судьбы и использовал для объектов конструкторы и деструкторы явно и обязательно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.05.2013, 21:04   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Хм , странный вопрос.
Возможно, Вы не в курсе, что
Код:
type tt = object
объявляет именно объект, а не класс. Объекты (которые используете Вы) это устаревшие типы из объектного паскаля, в дельфи они лишь для совместимости. А положено использовать классы (задание, я уверен на 99%, относится именно к ним).
Код:
type tt = class
создание экземпляра класса (в просторечии объекта, от слова "объектно" в ООП) - производится вызовом конструктора у класса, т.е. myobjvar := tt.Create, уничтожение - вызовом деструктора (а ещё лучше специального метода Free или системной процедуры FreeAndNil) у экземпляра класса, т.е. myobjvar.Free

Советую прочитать про старый тип объектов и понять с чем его едят, а также и про классы, чтобы представлять отличия и преимущества.
Вкратце: объекты - что-то типа записей с методами (в новых версиях дельфи 2007+ они и так есть , в более ранних версиях записи не могут содержать методы, и их можно эмулировать типом object ), они создаются на стеке и не требуют обязательного вызова конструктора и деструктора (хотя обычно программист сам определяет что надо и вызывает в этом случае). Экземпляры классов же создаются в куче, и необходимо использование конструктора и деструктора.

В Вашем случае - был создана сущность типа "объект" на стеке и она сразу доступна для работы с ней, поменяв определение на класс, и больше ничего не меняя в коде - получите Access Violation при обращении к несозданному экземпляру в строке A.x := 42; так как переменная типа "экземпляр класса" является указателем на начало тела экземпляра в куче, и без конструктора указывает неизвестно куда, конструктор же инициализирует данные для экземпляра и ссылку на них записывает в эту переменную.

Возможно, примеры, посланные заказчиком , прольют определённый свет, сбросьте архивом/кодом сюда.

Последний раз редактировалось phomm; 05.05.2013 в 21:10.
phomm вне форума Ответить с цитированием
Старый 05.05.2013, 21:07   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вообще-то ООП подразумевает инкапсуляцию, т.е. полное отсутствие переменных в интерфейсной части и доступ к ним только через методы.
Обычно при инициализации внутренним данным объекта выделяется память и присваиваются начальные значения.
s-andriano вне форума Ответить с цитированием
Старый 05.05.2013, 21:20   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
поменяв определение на класс, и больше ничего не меняя в коде - получите Access Violation
Нет не получишь.
Цитата:
и без конструктора указывает неизвестно куда
Неправда. Дизассемблируй вот такой код:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { c }

  c=class x:byte; procedure a; end;

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ c }

procedure c.a;
begin
  form1.Caption:=IntToStr(x);
end;

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var q:c;
begin
 q.x:=11;
 q.a;
end;

end.
Что покажет?
Цитата:
конструктор же инициализирует данные для экземпляра
Вот оно! Ключевое слово - инициализация.
Одно из парадигм ООП, которое как бы является неким стандартом.
Конструктор, особенно при создании многочисленной иерархии объектов может что-то инициализировать полезное для объекта.
Для форм например инициализируются их основные свойства описанные в DFM файлах (если это делфи).
Цитата:
Вообще-то ООП подразумевает инкапсуляцию
Вотъ Вотъ.
Как говорится: На метле летать можно, но на машине лучше
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.05.2013, 21:28   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Вопрос у меня такой: Нужно ли использовать конструкторы/деструкторы для ОБЪЕКТОВ?
Нужно.
Цитата:
работает нормально и выдаёт число "42" как положено
Ну еще бы, такое число не может выдаваться неправильно .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 05.05.2013, 22:24   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Я подразумевал
Цитата:
Код:
type TT = object
			x: byte;
		  end;		  
var	A: TT;
begin
	A.x:=42;	
	WriteLn(A.x);
end.
что A будет глобальная (код мол, для консольного проекта) - тогда получим законным ав по шапке, а полухакерские методы негоже применять, за такое по голове не погладят, вдруг у меня класс с первым полем - толстым статмассивом, что больше maxstacksize ? В общем, это из разряда забавных ub

Предлагаю копья не ломать, а подождать примеров и вообще ответа ТС.
phomm вне форума Ответить с цитированием
Старый 05.05.2013, 22:54   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Вот, примеры выкладываю в приложение. Я просто не очень хотел этого делать, чтобы не подставлять заказчика (вдруг препод пропалит)
Примеры сам не читал пока что. Там форматирования, кстати, нет.

phomm
Цитата:
Советую прочитать про старый тип объектов и понять с чем его едят, а также и про классы, чтобы представлять отличия и преимущества.
Порекомендуйте, пожалуйста, литературу, где это можно взять.

Цитата:
Экземпляры классов же создаются в куче, и необходимо использование конструктора и деструктора.
Подождите. Так понятия "объект" и "экземпляр класса" тождественны и отождествляются вами? Может, жирное следует заменить на просто "классы"?

s-andriano
Цитата:
Вообще-то ООП подразумевает инкапсуляцию, т.е. полное отсутствие переменных в интерфейсной части и доступ к ним только через методы.
Мне это известно. В этом инкапсуляция и заключается. Закроем поля объекта в Private и будем их менять только через методы. Но я привёл простой пример, так как мне щас не инкасуляция важна.

Кстати, работа будет выполняться в ФриПаскаль
Вложения
Тип файла: rar FFF.rar (1.8 Кб, 14 просмотров)

Последний раз редактировалось Вадим Мошев; 05.05.2013 в 22:56.
Вадим Мошев вне форума Ответить с цитированием
Старый 05.05.2013, 23:02   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что A будет глобальная (код мол, для консольного проекта)
Ну в этом случае да. Проблема на лице )
Цитата:
Предлагаю копья не ломать
Концы в воду, штыки в землю.
Цитата:
Может, жирное следует заменить на просто "классы"?
Классы это типы. А объекты или экземпляры классов - переменные. Это разные вещи.
Цитата:
Порекомендуйте, пожалуйста, литературу
По-моему в хелпе делфи самое четкое описание инструкции object )
Цитата:
Закроем поля объекта в Private и будем их менять только через методы.
Инициализация конструктором по факту и делает это. Потому и рекомендуется к применению.
I'm learning to live...

Последний раз редактировалось Stilet; 05.05.2013 в 23:05.
Stilet вне форума Ответить с цитированием
Старый 06.05.2013, 07:32   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Может, жирное следует заменить на просто "классы"?
Класс это просто описание, калька с которой берутся экземпляры класса. Но экземпляр класса может в зависимости от логики менять свое внутреннее состояние.
Цитата:
Вообще-то ООП подразумевает инкапсуляцию, т.е. полное отсутствие переменных в интерфейсной части и доступ к ним только через методы.
Вообще-то языков с такой строгостью раз и обчелся. И потом реальная жизнь показывает, что такая модель себя не оправдывает, иногда это чрезмерное усложнение. Строгой ООП как мне кажется два Руби и Смоллтолк (но вроде в Руби тоже позволительно разбрасываться переменными в в свободном доступе). C# вроде тоже претендент, но там кажись не все переменные суть объекты.
Нечто подобное есть функциональных языках, но там это навеяно функциональным стилем.

ЗЫ,
Код:
type tt = class
Насколько я помню эквивалентно
Код:
type tt = class(Object)
, но надо уточнить.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 06.05.2013 в 07:41.
Utkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструкторы и деструкторы Qwoort Общие вопросы C/C++ 2 18.06.2012 09:17
Конструкторы и деструкторы programmm Помощь студентам 0 04.06.2011 16:33
Конструкторы и деструкторы @arkadii Общие вопросы C/C++ 2 10.11.2010 17:40
С++ и С# Конструкторы и Деструкторы exKenny Помощь студентам 1 27.04.2010 12:32