Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.035 c