Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Конструктор объекта и выделение памяти.   Найти похожие ветки 

 
Demon_mhm   (2004-03-04 18:19) [0]

Господа! Помогите подалуйста! Не совсем понятно, нужно ли при создании объекта вручную выделять память под него (при помощи New ()) или это делается автоматически. И как в таком случае получить указатель на вновь создаваемый объект внутри конструктора?


 
panov ©   (2004-03-04 18:22) [1]

Память выделяется автоматически при вызове конструктора, если речь идет о классовом объекте.

var
MyObj: TMyObject;
begin
NyObj := TMyObject.Create;


 
WebErr ©   (2004-03-04 18:24) [2]

Скорее всего, достаточно вызвать Create, унаследованный от TObject, от которого всё и проистекает. Но не уверен в своём ответе... Я больше понимаю ООП в С++, чем Object Pascal.


 
Digitman ©   (2004-03-04 18:25) [3]


> И как в таком случае получить указатель на вновь создаваемый
> объект внутри конструктора?


на то есть ключ.слово Self

явное (впрочем как и неявное) обращение к Self в любом методе класса (будь то даже конструктор или диструктор) есть обращение к "самому себе"


 
Demon_mhm   (2004-03-04 18:27) [4]

Здесь все ясно, у меня есть массив объектов и необходимо чтобы при создании объекта класса он добавлялся в этот массив прямо в конструкторе. Как это реализовать? Код вот такой?
constructor TCountry.Create(PCountryName :string);
begin
 Setlength (Countries, Length(Countries));
 Countries[High(Countries)] := ???;
 Countryname := PCountryName;
end;


 
Demon_mhm   (2004-03-04 18:28) [5]

То есть нужно писать:
Countries[High(Countries)] := self;
?


 
WebErr ©   (2004-03-04 18:31) [6]


> Demon_mhm   (04.03.04 18:28) [5]
> То есть нужно писать:
> Countries[High(Countries)] := self;
> ?

Ответ: да


 
TButton ©   (2004-03-04 18:32) [7]

:=self;


 
Romkin ©   (2004-03-04 18:32) [8]

Кошмар. Наиболее тормозной вариант... SetLength:
1. Выделяет память под новый размер массива
2. Копирует туда все, что было раньше
3. освобождает предыдущий массив
И как ты думаешь, это эффективно?


 
Demon_mhm   (2004-03-04 18:33) [9]

Спасибо преогромное!!!


 
BOA_KAA ©   (2004-03-04 18:33) [10]

inherited?


 
Тимохов ©   (2004-03-04 18:50) [11]


> Romkin ©   (04.03.04 18:32) [8]

Не обязательно копирует.
SetLength для дин массивов пользуется AllocMem. Перемещение области памяти будет только если не хватило текущего блока памяти.
В случае если хватило, то просто к текущему блоку добавятся свободные места.
Могу, конечно, ошибаться, но думаю, что я почти прав.

SetLength можно сильно ускорить если использовать подход из TList с Count and Capacity. Работает очень быстро - бустрее у меня не получилось. Главное, что обращание к элементам массива очень быстрое. В этом такой подход сильно выигрывает у TList, т.к. там для обращания к элементами выполняются методы GetItem и PutItem. В дин массивах идет просто обращанение к памяти.
Проверено.


 
WebErr ©   (2004-03-04 18:51) [12]


> Demon_mhm   (04.03.04 18:33) [9]
> Спасибо преогромное!!!

Не забудь, что ты перегрузил Create с параметром(ми), но для выделения памяти под объект всё-таки нужно вызывать наследованный конструктор Create без параметров.

constructor TSome.Create(A: TA [; ...] );
begin
 Self := Create; // снова этот Self! ;)
 ...
end;


 
WebErr ©   (2004-03-04 18:54) [13]


> constructor TCountry.Create(PCountryName :string);
> begin
>  Setlength (Countries, Length(Countries));
>  Countries[High(Countries)] := ???;
>  Countryname := PCountryName;
> end;

В твоём случае это -

constructor TCountry.Create(PCountryName :string);
begin
 Self := Create;
 Setlength (Countries, Length(Countries));
 Countries[High(Countries)] := ???;
 Countryname := PCountryName;
end;

Если я не прав - поправте меня, ибо Pascal я знаю куда хуже C++.


 
Тимохов ©   (2004-03-04 18:54) [14]


> WebErr ©   (04.03.04 18:51) [12]

Вы что, над новичками издеваетесь? :)))))


 
Тимохов ©   (2004-03-04 18:54) [15]


> Если я не прав - поправте меня, ибо Pascal я знаю куда хуже
> C++.

Вы не правы.


 
WebErr ©   (2004-03-04 18:56) [16]


> Тимохов ©   (04.03.04 18:54) [14]
>
> > WebErr ©   (04.03.04 18:51) [12]
>
> Вы что, над новичками издеваетесь? :)))))

Я и сам-то новичок! :) Я и универ-то ещё не закончил, и даже работаю пока только на полставки... :) Так что вот! :)


 
WebErr ©   (2004-03-04 18:57) [17]


> Тимохов ©   (04.03.04 18:54) [15]

Why?


 
Тимохов ©   (2004-03-04 18:58) [18]


> WebErr ©   (04.03.04 18:56) [16]

Конеструктор за выделение памяти не отвечает. Когда конструктор вызван - память уже выделена. Если вы не вызовете конструктор предка, то просто не инициализируете некоторые поля (если они, конечно, требуют инициализации) и все. На факте создания объекта это не скажется.

Память выделяется в NewInstance


 
Тимохов ©   (2004-03-04 18:58) [19]


> Память выделяется в NewInstance

который дельфи за вас сам вызовет...


 
icWasya ©   (2004-03-04 19:29) [20]

В твоём случае это -

constructor TCountry.Create(PCountryName :string);
begin
inherited Create;// - вызов конструктора предка
Setlength (Countries, Length(Countries)+1);//не забыть
Countries[High(Countries)] := Self;
Countryname := PCountryName;
end;


 
KSergey ©   (2004-03-04 21:37) [21]

> WebErr ©   (04.03.04 18:54) [13]
> В твоём случае это -
>
>  Self := Create; !!!!!

Нечего народу мозги пудрить! Это вам не там... ну т.е. не С++. Почитайте книги.



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
7-1073040090
Tahion2
2004-01-02 13:41
2004.03.28
Как узнать устаовлен ли Service Pack 1 в Windows XP?


6-1073910254
INTAARI
2004-01-12 15:24
2004.03.28
как узнать, что данные дошли в TcpClient


14-1077979354
Шишкин Илья
2004-02-28 17:42
2004.03.28
Проблема с железом


4-1073138516
GrayFace
2004-01-03 17:01
2004.03.28
Как взять ширину символа, отступ до и отступ после него.


14-1078140492
John S.
2004-03-01 14:28
2004.03.28
AVP кто нибудь юзает ?