Текущий архив: 2005.08.21;
Скачать: CL | DM;
Вниз
народ, оцените код Найти похожие ветки
← →
Dust © (2005-08-01 13:58) [0]писалось для склеивания пакетов пришедших из сети,
а так же для их сборки перед отправкой
http://nostdal.org/paste/327e65c87affb7475eb3e3215c543b05.html
← →
Ega23 © (2005-08-01 14:02) [1]А зачем конструктор нужен? Я не понял...
← →
Defunct © (2005-08-02 02:09) [2]pinging nostdal.org [193.246.214.118] with 32 bytes of data:
request timed out.
request timed out.
request timed out.
request timed out.
Ресурс вы выбрали неудачный..
← →
Dust © (2005-08-02 14:03) [3]я убрал несколько ошибок
кстати, нормальный хост...
http://nostdal.org/paste/5192e561ff56c3a9ce5900bced3b5b3a.html
← →
Defunct © (2005-08-02 14:54) [4]Dust © (02.08.05 14:03) [3]
> кстати, нормальный хост...
Днем доступен, ночью - нет ;>
destroy;override; поставьте.
class function imho лишняя, почему бы просто не описать второй конструктор. (и нужен ли он?)
функции
function FUnreadSize() : dword;
function FContainerSize() : dword;
function FDataPresent() : boolean;
должны быть в private, иначе нет смысла создавать property для каждой из них
flatlist imho вообще ненужная запись, можно просто все ее поля включить в private секцию.
> procedure PushRaw(const packet: pointer; const count : dword);
Делают обычно так:
procedure PushRaw(var Buf; const count : dword);
для чтения
procedure PopRaw(var Buf; var count : dword);
По офромлению кода:
код трудно читаем, например здесьif (Flatlist.shiftL + count)<=(Flatlist.shiftR) then begin
p:=Pointer(dword(Flatlist.pFlat)+Flatlist.shiftL);
CopyMemory(packet, p, count);
flatlist.isDataPresent :=true;
if not KeepMarker then Flatlist.shiftL:=Flatlist.shiftL+count; end;
не видно к чему относится end, и не ясно из названия полей на что указывает p. В выделенной строчке непонятно зачем нужны поля shiftL и shiftR;
в общем, я бы весь класс переписал..
← →
Ega23 © (2005-08-02 15:38) [5]Всё-таки непонятно, зачем нужен constructor, у которого только inherited вызов идёт?
← →
Dust © (2005-08-03 09:37) [6]2Ega23
> Всё-таки непонятно, зачем нужен constructor, у которого
> только inherited вызов идёт?
Я до сих пор считаю, что именно конструктор создаёт объект.
и именно поэтому вызовов конструктора я поместил в функцию класса
class function TFIFORawQueue.CreateFIFORawQueue(
const size: dword): TFIFORawQueue;
begin
Result:=TFIFORawQueue.Create();
Result.flatlist.pFlat:=AllocMem(size);
Result.flatlist.size :=size;
Result.flatlist.shiftR :=0;
Result.flatlist.shiftL :=0;
Result.flatlist.isDataPresent :=false;
end; //class function TFIFORawQueue.CreateFIFORawQueue
← →
Dust © (2005-08-03 09:47) [7]2 Defunct
class function
я сделал потому, что если переопределить параметры вызова конструктора, то вызов inherited;
становится недоступным.
вообще я не силён в ООП.
насчёт структуры - в начале она вообще присутствовала в рамках друго объекта, а полей у него было!!! тьма тьмущая, я принял решение упростить объект, и разделить его на несколько частей, потому как чем дальше этот объект(т.ч. класс) я описывал тем более дремучим он становился, а если уже есть готовая структура... почему бы ею же и не воспользоваться
← →
Digitman © (2005-08-03 09:47) [8]
> до сих пор считаю, что именно конструктор создаёт объект
TFIFORawQueue = class(...)
public
constructor Create(ASize: DWord);
destructor Destroy; override;
end;
constructor TFIFORawQueue.Create(ASize: DWord);
begin
inherited;
with flatlist do
begin
GetMem(pFlat, Size);
Size := Asize;
end;
end;
destructor TFIFORawQueue.Destroy;
begin
FreeMem(flatlist.pFlat);
inherited;
end;
...
FIFORawQueueInstance := TFIFORawQueue.Create(100);
← →
Dust © (2005-08-03 10:06) [9]люди, объясните пожалуйста, что за вызов inherited? и почему, когда я переопределяю актуальные параметры конструктора
constructor TFIFORawQueue.Create(ASize: DWord);
компилер на него ругается
[Error] FIFORawQueueClass.pas(47): Incompatible types
столкнувшись именно с этим я создал функцию класса
← →
Digitman © (2005-08-03 10:16) [10]
> актуальные параметры
что за "актуальные" ?
есть формальные параметры и есть фактические параметры ..
> переопределяю
что значит "переопределяю" ?
либо определяешь новый метод, либо перекрываешь одноименный виртуальный метод предка ..
← →
evvcom © (2005-08-03 10:26) [11]
> когда я переопределяю актуальные параметры конструктора
Это как раз формальные параметры. Чтобы использовать то же имя с другими типами параметров функцию/процедуру/метод надо перегружать, используя волшебное слово overload; А можно, чтобы меньше путаться свой новый конструктор назвать несколько иначе. Ключевым здесь является слово constructor, а не само имя Create.
← →
Dust © (2005-08-03 10:27) [12]
> Digitman © (03.08.05 10:16) [10]
>
> > актуальные параметры
>
>
> что за "актуальные" ?
>
> есть формальные параметры и есть фактические параметры ..
оговорился, формальные параметры.
определяю конструктор с входными параметрами
← →
Digitman © (2005-08-03 10:29) [13]
> Dust © (03.08.05 10:27) [12]
покажи полный текст (декларация и реализация) класса, в том виде в каком "компилер на него ругается" ..
← →
Ega23 © (2005-08-03 10:34) [14]Тебе надо было написать
TFIFORawQueue=class (...)
....
public
constructor Create(ASize: DWord);
end;
constructor TFIFORawQueue.Create(ASize: DWord);
begin
inherited Create;
.......
end;
И не нужно никаких class-функций...
← →
ЮЮ © (2005-08-03 10:37) [15]>TFIFORawQueue=class (...)
многое зависит от того, что скрывается за ...
← →
Ega23 © (2005-08-03 10:41) [16]2 ЮЮ © (03.08.05 10:37) [15]
Конкретно в случае автора - вообще TObject
← →
Dust © (2005-08-03 11:17) [17]
> Digitman © (03.08.05 10:29) [13]
> покажи полный текст (декларация и реализация) класса, в
> том виде в каком "компилер на него ругается" ..
декларация:
...
constructor TFIFORawQueue.Create(ASize: DWord);
...
реализация:
constructor TFIFORawQueue.Create(ASize: DWord);
begin
inherited; //<<----Error in compilling
end; //constructor
> [Error] FIFORawQueueClass.pas(47): Incompatible types
именно после этого я придумал функцию класса. На самом деле я не знаю зачем нужен вызов inherited
Остальной текст вы можете найти по ссылке чуть-чуть выше
← →
Ega23 © (2005-08-03 11:34) [18]
реализация:
constructor TFIFORawQueue.Create(ASize: DWord);
begin
inherited Create; //<<----Error in compilling
end; //constructor
Должно заработать.
← →
Alexander Panov © (2005-08-03 11:36) [19]Dust © (03.08.05 9:47) [7]
class function я сделал потому, что если переопределить параметры вызова конструктора, то вызов inherited;
В классе может быть несколько конструкторов с различными параметрами.
при вызове inherited-конструктора(а это просто-напросто вызов конструктора класса-предка) имя конструктора можно указать явно, передав ему соответствующие параметры(если список параметров не совпадает со текущего конструктора), либо опустив параметры в случае полного совпадения.
И вообще, ключевое слово inherited, примененное к любому методу класса, означает всего лишь вызов метода предка.
← →
Digitman © (2005-08-03 11:43) [20]
> Dust © (03.08.05 11:17) [17]
если ты написал
inherited;
то компилятор пытается обнаружить у класса-предка одноименный констр.метод с ТАКИМИ ЖЕ параметрами, и если таковой не найден, то ты получаешь как раз ту самую ошибку
если же ты написал
inherited Create(такие-то параметры, если они есть);
то компилятор пытается обнаружить у класса-предка констр.метод с ЯВНО указанным тобой именем (т.е. Create в дан.случае) с такими-то указанными тобой параметрами
← →
Dust © (2005-08-03 13:55) [21]а вообще это делать нужно?
нужно ли вызывать inherited если класс порождён от TObject?
← →
Digitman © (2005-08-03 14:10) [22]
> Dust © (03.08.05 13:55) [21]
нужно.. если ты не уверен, что завтра по каким-либо (неочевидным сегодня) причинам тебе не придется сменить предка своего объекта
тело констр.метода TObject.Create - пустое, вызов этого метода холостой, но нет гарантий, что завтра Борланд не наполнит тело этого метода какой-либо функц-ю
← →
tesseract © (2005-08-04 11:03) [23]Возможно оффтопик: но есть набор функций EZDSL от автора книге "Фундаментальные алгоритмы и основы данных на делфи" где реализованы Стеки ,очереди, и тд и тп. Если хочешь посмотреть как это выглядит в идеале и с поддержкой многопоточности лучше посмотри как сделано там. А ещё лучше книгу надыбай ИМХО MustHave.
← →
Dust © (2005-08-04 13:32) [24]
2 tesseract © (04.08.05 11:03) [23]
спасибо за совет, обязательно найду и прочитаю.
2 Digitman © (03.08.05 14:10) [22]
спасибо за разъяснение
2ALL
я считаю, что здесь получил ответы на свои вопросы, и тему можно закрывать
Страницы: 1 вся ветка
Текущий архив: 2005.08.21;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.042 c