Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализация Класса комплексных чисел  (Прочитано 16137 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 22-03-2010 08:58 » new

Делаю класс комплексн чисел на 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
Помогающий

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-03-2010 09:48 » 

Что делает Inherited create? От чего вы его (свой класс) унаследовали?
Записан

С уважением, Oldy.
eugrita
Помогающий

ru
Offline Offline

« Ответ #4 : 22-03-2010 09:56 » 

хорошо, давайте выбросим - только все равно валится на операторе присвоения
Полагаю как раз из-за отсутствия выделения памяти классу
Записан
zubr
Гость
« Ответ #5 : 22-03-2010 10:04 » 

eugrita, покажи как ты создаешь объект класса TComplex.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-03-2010 10:23 » 

Цитата
Код:
 cmp^.z.x :=xx;  cmp^.z.y :=yy
конечно, не компилится: как минимум, откуда у z возьмутся поля x и y?
Записан
eugrita
Помогающий

ru
Offline 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
Помогающий

ru
Offline Offline

« Ответ #9 : 22-03-2010 11:18 » 

да спасибо.Так прошло
А что тот подход с принудительным выделением памяти указателю неправилен в принципе?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 22-03-2010 15:57 » 

eugrita, есть классы - это, грубо говоря, типы. есть экземпляры класса, или объекты, которые, грубо говоря, являются переменными данного типа. любой экземпляр класса является указателем изначально. для него автоматически выделяется память в конструкторе, ваша задача - выделить память под другие объекты, объявленные именно в вашем классе.
Записан

eugrita
Помогающий

ru
Offline 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
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #12 : 22-03-2010 16:35 » 

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

2) для того, чтобы вызывать метод класса без создания экземпляра класса, его надо объявлять, как метод класса Улыбаюсь есть такая штука - class function (или class procedure). конструктор тоже является методом класса, хотя и неявно.
Записан

eugrita
Помогающий

ru
Offline 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
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #14 : 22-03-2010 16:56 » 

1) RESULT.Create; - вот смотрите, вы обращаетесь к методу объекта, которого ещё нет. это всегда даст ошибку. создать объект может только сам класс: Result := TComplex.Create.

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

я не совсем уверен, что для вашей задачи необходимы class function.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines