Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2011, 21:19   #1
вася радугов
Форумчанин
 
Регистрация: 09.04.2011
Сообщений: 134
По умолчанию Классы в делфи

Задали сделать лабораторную. Сделал все, что мог, но у меня очень много ошибок, проект не запускается.
Задание:
Создать приложение, которое взаимодействует с иерархией классов: TAnimal (базовый класс) и THuman, TDog, TCat (дочерние классы). Приложение должно не только создавать и уничтожать объекты дочерних классов, но и обмениваться сообщениями ("разговаривать") с ними.
Мой код:
Код:
unit Unit1;

interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Button1: TButton;
    Edit1: TEdit;
    RadioGroup1: TRadioGroup;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
  private

    { Private declarations }
   procedure Say(Animal:TAnimal);



  public
    { Public declarations }
  end;
  type

  TAnimal = class(TObject)

  private
  Name: string;

  public
  constructor Create(AName: string);
  constructor Create; overload;
  destructor Destroy;override;
  function GetName: string;
  property TheName: string read GetName;
   function TellMe: string; virtual; abstract;
  end;
THuman = class(TAnimal);
function TellMe: string; override;
function THuman.TellMe;
begin
Result := TheName;
end;

TDog = class(TAnimal);
function TellMe: string; override;
function TDog.TellMe;
begin
Result := 'Гав-Гав!'
end;}

TCat = class(TAnimal)
function TellMe: string; override;
function TCat.TellMe;
begin
Result := 'Мяу!'
end;

public
procedure SetName(AName: string);
property TheName: string read GetName write SetName;
   end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
constructor TAnimal.Create(AName: string);
begin
  Name := 'Безымянный';
end; 

 var
 Human:THuman;
 Dog:TDog;
 Cat:TCat;

function TAnimal.GetName;
begin
Result := Name;
end;

procedure TCat.SetName(AName: string);
begin
Name := AName;
end;
destructor TAnimal.Destroy;
begin
ShowMessage(Self.TheName+ ' умер!');
inherited Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Human := THuman.Create('Петя');
SpeedButton1.Caption := Human.TheName;
Dog := TDog.Create('Бобик');
SpeedButton2.Caption := Dog.TheName;
Cat := TCat.Create('Васька');
SpeedButton3.Caption :=  Cat.TheName;
   
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Human.Destroy;
Human := THuman.Create(Edit1.Text);
SpeedButton1.Caption := Human.TheName;
end;


procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Dog.Destroy;
Dog := TDog.Create(Edit1.Text);
SpeedButton2.Caption := Dog.TheName;

end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
 Cat.Destroy;
 Cat := TCat.Create(Edit1.Text);
 SpeedButton3.Caption := Cat.TheName;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Human.Free;
 Dog.Free;
 Cat.Free;

end;
 procedure TForm1.Say(Animal:TAnimal);
begin
  Label1.Caption := Animal.TellMe;
end;



procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case  WhoRg.ItemIndex of
0: Say(Human);
1: Say(Dog);
2: Say(Cat);

end;
 end;
end.
Ошибки:
Цитата:
[Error] Unit1.pas(31): Undeclared identifier: 'TAnimal'
[Error] Unit1.pas(40): Identifier redeclared: 'TAnimal'
[Error] Unit1.pas(47): Previous declaration of 'Create' was not marked with the 'overload' directive
[Error] Unit1.pas(53): Class type required
[Error] Unit1.pas(47): Previous declaration of 'Create' was not marked with the 'overload' directive
[Error] Unit1.pas(53): Class type required
[Error] Unit1.pas(54): Unknown directive: 'override'
[Error] Unit1.pas(55): Undeclared identifier: 'TellMe'
[Error] Unit1.pas(56): Statements not allowed in interface part
[Error] Unit1.pas(57): Undeclared identifier: 'Result'
[Error] Unit1.pas(60): Declaration expected but identifier 'TDog' found
[Error] Unit1.pas(62): Function needs result type

Последний раз редактировалось Stilet; 04.09.2011 в 21:24.
вася радугов вне форума Ответить с цитированием
Старый 04.09.2011, 21:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
procedure Say(Animal:TAnimal);



public
{ Public declarations }
end;
type

TAnimal
= class(TObject)
Ты в процедуре Say ссылаешься на тип, который еще не описан, компилятор идет сверху вниз, и если он до нее такой класс не нашел значит программисту нужно читать мануалы и описывать класс выше.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2011, 21:29   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Твои ошибки, вероятно, от отсутствия этапа проектирования. Как ты представляешь классы? Покажи иерархию.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 04.09.2011, 21:29   #4
вася радугов
Форумчанин
 
Регистрация: 09.04.2011
Сообщений: 134
По умолчанию

просмотрел, но все-таки не понял. подскажите как исправить
вася радугов вне форума Ответить с цитированием
Старый 04.09.2011, 21:30   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Просмотрели что?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 04.09.2011, 21:32   #6
вася радугов
Форумчанин
 
Регистрация: 09.04.2011
Сообщений: 134
По умолчанию

Utkin, я вообще-то плохо разбираюсь в классах и смутно представляю, как исправить свои ошибки

мне указали, где ошибка, я посмотрел, но не знаю как ее исправить

Последний раз редактировалось Stilet; 04.09.2011 в 21:43.
вася радугов вне форума Ответить с цитированием
Старый 04.09.2011, 21:37   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Наследование ты осуществляешь верно. Но каждый класс должен иметь описание конструктора и деструктора. Это как минимум. Где же твой конструктор человека? Да и как ты кошку собрался делать?
Потом, пускай пример учебный, но порядок и дисциплина должны быть во всем. Поэтому я бы на твоем месте вынес реализацию задачи в отдельный юнит, а в данном (со окошками и кнопками) просто подключил бы его.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 04.09.2011 в 21:40.
Utkin вне форума Ответить с цитированием
Старый 04.09.2011, 21:42   #8
вася радугов
Форумчанин
 
Регистрация: 09.04.2011
Сообщений: 134
По умолчанию

Вот исправил но программа не хочет работать
Код:
unit Unit1;

interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Button1: TButton;
    Edit1: TEdit;
    RadioGroup1: TRadioGroup;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    end;
     type
     TAnimal = class(TObject)

  private
  Name: string;

  public
  constructor Create(AName: string);
  constructor Create; overload;
  destructor Destroy;override;
  function GetName: string;
  property TheName: string read GetName;
   function TellMe: string; virtual; abstract;
  end;
THuman = class(TAnimal);
function TellMe: string; override;
function THuman.TellMe;
begin
Result := TheName;
end;

TDog = class(TAnimal);
function TellMe: string; override;
function TDog.TellMe;
begin
Result := 'Ãàâ-Ãàâ!'
end;}

TCat = class(TAnimal)
function TellMe: string; override;
function TCat.TellMe;
begin
Result := 'Ìÿó!'
end;

public
procedure SetName(AName: string);
property TheName: string read GetName write SetName;
   end;


  private

    { Private declarations }
   procedure Say(Animal:TAnimal);



  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
constructor TAnimal.Create(AName: string);
begin
  Name := 'Áåçûìÿííûé';
end;

 var
 Human:THuman;
 Dog:TDog;
 Cat:TCat;

function TAnimal.GetName;
begin
Result := Name;
end;

procedure TCat.SetName(AName: string);
begin
Name := AName;
end;
destructor TAnimal.Destroy;
begin
ShowMessage(Self.TheName+ ' óìåð!');
inherited Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Human := THuman.Create('Ïåòÿ');
SpeedButton1.Caption := Human.TheName;
Dog := TDog.Create('Áîáèê');
SpeedButton2.Caption := Dog.TheName;
Cat := TCat.Create('Âàñüêà');
SpeedButton3.Caption :=  Cat.TheName;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Human.Destroy;
Human := THuman.Create(Edit1.Text);
SpeedButton1.Caption := Human.TheName;
end;


procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Dog.Destroy;
Dog := TDog.Create(Edit1.Text);
SpeedButton2.Caption := Dog.TheName;

end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
 Cat.Destroy;
 Cat := TCat.Create(Edit1.Text);
 SpeedButton3.Caption := Cat.TheName;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Human.Free;
 Dog.Free;
 Cat.Free;

end;
 procedure TForm1.Say(Animal:TAnimal);
begin
  Label1.Caption := Animal.TellMe;
end;



procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case  WhoRg.ItemIndex of
0: Say(Human);
1: Say(Dog);
2: Say(Cat);

end;
 end;
end.
From Stilet: Код оформляй спецтегом по кнопке #.

Utkin, мы про подключение unit еще не проходили. вседолжно быть в одном

Последний раз редактировалось Stilet; 04.09.2011 в 21:46.
вася радугов вне форума Ответить с цитированием
Старый 04.09.2011, 21:45   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но каждый класс должен иметь описание конструктора и деструктора. Это как минимум.
Да ладно, прям уж так строго
Цитата:
программа не хочет работать
Как определил? Почему бы не пройтись отладчиком по шагам в обработчиках?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2011, 21:50   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Не пиши несколько постов подряд. В твоих сообщениях есть кнопка Правка, если хочешь дополнить мысль, лучше нажми на нее, она там не для красоты нарисована.

Спрашиваю второй раз где твои конструкторы человека, собаки и кошки? Каждый создаваемый тобой класс обязательно должен содержать конструктор и деструктор, написанный твоими же ручками. Покажи мне где ты их написал? Знаешь еще почему ты тонешь в коде? У тебя нет комментариев. Они не обязательны, но весьма полезны. Пиши их перед функциями и процедурами (с указанием, что каждая из них делает), а также для тех строк, которые для тебя сложны.

Цитата:
Да ладно, прям уж так строго
Не не строго, просто после этого память перестаёт утекать в неизвестном направлении. Особенно если твой класс содержит сложные данные, например, создает экземпляр другого класса.

Я придерживаюсь простых правил:
1. Любой созданный мой класс должен содержать явно написанный конструктор с инициализацией полей.
2. Любой созданный мой класс должен содержать явно написанный деструктор с освобождением выделенной памяти.
3. Все созданные объекты должны быть уничтожаны сразу после того как перестают быть нужными в программе.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 04.09.2011 в 21:55.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы в Делфи Mg_Tasha Помощь студентам 3 17.10.2009 17:39
Задача в Делфи, классы. Катерина_Ио Фриланс 3 18.05.2009 14:10
Код игры на Паскале и на Делфи сильно отличается? Как переписать код с Паскаля в Делфи? Mclaren Помощь студентам 2 27.04.2009 22:37