eugrita
Помогающий
Offline
|
|
« : 22-03-2010 08:58 » |
|
Делаю класс комплексн чисел на Delphi . Вот заготовка unit Complex; interface Type cmplx=record re,im: Real; end; Type TComplex=class private R,fi: real; public z: cmplx; function AddC(z1,z2:Cmplx): Cmplx; //вставка в конец constructor Create(xx:real;yy:real); end; cmp=^TComplex; implementation function TComplex.AddC(z1,z2:Cmplx): Cmplx; //вставка в конец begin RESULT.re:=z1.re+z2.re; RESULT.im:=z1.im+z2.im; end; constructor TComplex.Create(xx:real;yy:real); begin New(cmp); inherited create; // cmp^.z.x :=xx; cmp^.z.y :=yy; {так не компилится} self.z.re := xx; {так компилится, но валится при выполнении} end; end.
--------------------------------- Проблема с конструктором. Полагаю при создании класса надо выделить память. Для этого ввел указатель на класс cmp и вызываю New(cmp) Проблема, что потом не могу через указатель обратиться к членам данных re, im (чтобы присвоить им значения) - не пропускает компилятор
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #1 : 22-03-2010 09:06 » |
|
Не понял зачем вообще cmp. Для обращения к собственному объекту - ключевое слово Self. Убери из кода cmp=^TComplex; и все с ним связанное.
|
|
|
Записан
|
|
|
|
eugrita
Помогающий
Offline
|
|
« Ответ #2 : 22-03-2010 09:22 » |
|
Как уже говорил, такой вариант конструктора валится при выполнении constructor TComplex.Create(xx:real;yy:real); begin // New(cmp); inherited create; self.z.re := xx; {так компилится, но валится при выполнении} self.z.im := yy; end;
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #3 : 22-03-2010 09:48 » |
|
Что делает Inherited create? От чего вы его (свой класс) унаследовали?
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
eugrita
Помогающий
Offline
|
|
« Ответ #4 : 22-03-2010 09:56 » |
|
хорошо, давайте выбросим - только все равно валится на операторе присвоения Полагаю как раз из-за отсутствия выделения памяти классу
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #5 : 22-03-2010 10:04 » |
|
eugrita, покажи как ты создаешь объект класса TComplex.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #6 : 22-03-2010 10:23 » |
|
cmp^.z.x :=xx; cmp^.z.y :=yy
конечно, не компилится: как минимум, откуда у z возьмутся поля x и y?
|
|
|
Записан
|
|
|
|
eugrita
Помогающий
Offline
|
|
« Ответ #7 : 22-03-2010 11:07 » |
|
var c1,c2,c: TComplex; begin c1.Create(1,2); c2.Create(3,1);
а по поводу не компилится извините неточно написал операторы: правильно будет cmp^.z.re :=xx; cmp^.z.im :=yy; но компилятор говорит на это: поставив курсор правее ^ ( expected , but ^ found
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #8 : 22-03-2010 11:09 » |
|
c1 := TComplex.Create(1, 2); c2 := TComplex.Create(3, 1);
|
|
|
Записан
|
|
|
|
eugrita
Помогающий
Offline
|
|
« Ответ #9 : 22-03-2010 11:18 » |
|
да спасибо.Так прошло А что тот подход с принудительным выделением памяти указателю неправилен в принципе?
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #10 : 22-03-2010 15:57 » |
|
eugrita, есть классы - это, грубо говоря, типы. есть экземпляры класса, или объекты, которые, грубо говоря, являются переменными данного типа. любой экземпляр класса является указателем изначально. для него автоматически выделяется память в конструкторе, ваша задача - выделить память под другие объекты, объявленные именно в вашем классе.
|
|
|
Записан
|
|
|
|
eugrita
Помогающий
Offline
|
|
« Ответ #11 : 22-03-2010 16:19 » |
|
Да. Понятно - общий принцип создания классов во всех языках. А вот добавление к рассматриваемому примеру. Тоже несовсем мне понятное. 2 реализации метода сложения комплексн чисел (объявлены с overload) function TComplex.AddC(z2: TComplex): TComplex; //âñòàâêà â êîíåö begin RESULT.z.re:=Self.z.re+z2.z.re; RESULT.z.im:=Self.z.im+z2.z.im; end; function TComplex.AddC(z1:TComplex; z2:TComplex): TComplex; begin RESULT.z.re:=z1.z.re+z2.z.re; RESULT.z.im:=z1.z.im+z2.z.im; end; вызов каждого метода var c1,c2,c: TComplex; begin c1:= TComplex.Create(1,2); c2:= TComplex.Create(3,1); c:= TComplex.Create; c1.RFI(); c:=c.AddC(c1,c2); c:=c1.AddC(c2);//здесь почему-то валится В обоих случаях методы вызываются от реально созданного, т.е. размещенного в памяти объекта c и c1 1)Почему валится? 2)Насколько я понимаю, что в отличие от вызова конструктора метод нельзя вызвать так: TComplex.AddC(c1,c2); (по аналогии скажем со static-методами в C++). (Хотя по умочанию методы класса в Delphi - статические)
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #12 : 22-03-2010 16:35 » |
|
1) странно, что только на втором вызове валится. должен всегда валиться. потому что результат метода - TComplex - у вас не создаётся нигде, а ведь это такой же объект, как и все прочие. 2) для того, чтобы вызывать метод класса без создания экземпляра класса, его надо объявлять, как метод класса есть такая штука - class function (или class procedure). конструктор тоже является методом класса, хотя и неявно.
|
|
|
Записан
|
|
|
|
eugrita
Помогающий
Offline
|
|
« Ответ #13 : 22-03-2010 16:53 » |
|
так правильно? class function TComplex.Add(z1:TComplex; z2:TComplex): TComplex; begin RESULT.Create; RESULT.z.re:=z1.z.re+z2.z.re; RESULT.z.im:=z1.z.im+z2.z.im; end; и вызов c:=TComplex.Add(c1,c2); c.XY(); {без предварительного создания c}
а вот попытка преобразования 2 варианта метода Add в class function - неудачна class function TComplex.Add(z2: TComplex): TComplex; begin RESULT.Create; RESULT.z.re:=Self.z.re+z2.z.re; RESULT.z.im:=Self.z.im+z2.z.im; end; компилятор говорит, что для Self переменная z стала недоступна (ранее была в том же теле функции доступна!)
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #14 : 22-03-2010 16:56 » |
|
1) RESULT.Create; - вот смотрите, вы обращаетесь к методу объекта, которого ещё нет. это всегда даст ошибку. создать объект может только сам класс: Result := TComplex.Create.
2) переменная Self недоступна, потому что это указатель на объект. а у вас нет объекта - у вас есть только класс. т.е. как бы тип объекта.
я не совсем уверен, что для вашей задачи необходимы class function.
|
|
|
Записан
|
|
|
|
|