Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
1-1078874098
NetKnight
2004-03-10 02:14
2004.03.28
Report in PDF?


7-1071570060
vixic
2003-12-16 13:21
2004.03.28
защита от копирования CD


3-1077171427
Василий
2004-02-19 09:17
2004.03.28
DBase и прерывания


3-1077202782
Sasha_M
2004-02-19 17:59
2004.03.28
Как прочитать в Array поле Binary ?


14-1077768297
NOD
2004-02-26 07:04
2004.03.28
Уничтожитель!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский