Компилирует без ошибок,но...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Компилирует без ошибок,но...

Сообщение resident » 19.06.2016 00:54:34

Bombucho писал(а):в Юните1 у тебя в TKvadrat.Create(st:integer), одна переменная, а в TKvadrat.Create(st,pl,pe:integer) целых 3 переменных

Это называется параметры.
Функции с различными наборами параметров, но одинаковым именем должны иметь слово overload после объявления.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Компилирует без ошибок,но...

Сообщение Bombucho » 19.06.2016 00:55:03

AlphaBlend писал(а):значит у TKvadrat должно быть два конструктора ?
Код: Выделить всё
constructor TKvadrat.Create(st,pl,pe:integer); overload;
constructor TKvadrat.Create(st:Integer); overload;
......

constructor TKvadrat.Create...
begin
    inherited;
end;


Ну как я понимаю в конструкторе мы должны указать переменные которые будут браться с поля ввода, в нашем случае только длина стороны квадрата и длина апофемы, а другие перменные типа: площаь(квадрата,пирамиды),периметр(квадрата) не нужно вносить в constructor TKvadrat.Create . Повторяюсь компиляция проходит отлично, но выводит мне нужную информацию вот так
"Квадрат со стороной: 4см имеет периметр:0см и площадь:0см, а пирамида с апофемой:4см и с основание квадрата имеет площадь:0см"
При это в поле сторона квадрата я ввел 2 см, а в поле апофема пирамиды 4 см
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Компилирует без ошибок,но...

Сообщение AlphaBlend » 19.06.2016 00:57:53

Bombucho это называется "перегрузка методов" . То есть класс может иметь несколько одноименных методов , которые могут вести себя по-разному . Возможно , что в этом и причина ?
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Компилирует без ошибок,но...

Сообщение Bombucho » 19.06.2016 01:01:30

resident писал(а):
Bombucho писал(а):k это переменная которую мы вводим непосредственно в Эдит, в классе TKvadrat мы объявили, что

Да это понятно. Непонятно вапще зачем это всё, ведь кроме самого создания Kva, квадрат больше нигде не используется. Ну это я уже по второму кругу.


Я стараюсь использовать примеры из своих лекций, и вроде как все компилировалось и выводило корректные данные, а тут...
А как по другому реализовать не понимаю, в книге есть примеры, но они немного не подходят к данному коду

Добавлено спустя 2 минуты 2 секунды:
AlphaBlend писал(а):Bombucho это называется "перегрузка методов" . То есть класс может иметь несколько одноименных методов , которые могут вести себя по-разному . Возможно , что в этом и причина ?


Хм,возможно, сейчас попробую...
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Компилирует без ошибок,но...

Сообщение AlphaBlend » 19.06.2016 01:07:29

Мне кажется странным другое . Квадрат - это плоская фигура . А пирамида - геометрическое тело . Как можно строить потомка от родителя другого семейства ? Геометрическая фигура может быть каким-то свойством Геометрического тела ( основанием , стороной , сечением ) . Но никак не его родителем. Стоит , может , подумать о том , что класс для пирамиды реализовать от родителя TGeometricBody , а квадрат - от родителя TGeometricFigure ? Ведь не может картошка происходить от электрички , а сама электричка от кирпича ... :roll:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Компилирует без ошибок,но...

Сообщение Bombucho » 19.06.2016 01:14:29

AlphaBlend писал(а):Мне кажется странным другое . Квадрат - это плоская фигура . А пирамида - геометрическое тело . Как можно строить потомка от родителя другого семейства ? Геометрическая фигура может быть каким-то свойством Геометрического тела ( основанием , стороной , сечением ) . Но никак не его родителем. Стоит , может , подумать о том , что класс для пирамиды реализовать от родителя TGeometricBody , а квадрат - от родителя TGeometricFigure ? Ведь не может картошка происходить от электрички , а сама электричка от кирпича ... :roll:


Очевидно четырехульная пирамида, родительский класс квадрат (основание пирамиды), а пирамиды дочерний...Крч с условием задачи не поспоришь, что написано, то и стараюсь реализовать)
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Компилирует без ошибок,но...

Сообщение resident » 19.06.2016 01:15:27

Bombucho писал(а):При это в поле сторона квадрата я ввел 2 см, а в поле апофема пирамиды 4 см

Некоторые люди видят только то, что им напишут дюймовыми буквами и подсунут под нос. Или как-то так в Унесенных Ветром было.
Еще раз. Вы ввели сторону квадрата, создали сам экземпляр квадрата и... И дальше вы на него забили, вы ни этот квадрат, ни тем более его сторону нигде больше не используете.
Если еще понятней, то удалите переменные k, kva и ничего не изменится.

Как бы вот ваши классы показывают как нужно обрабатывать данные. Но вот сами данные экземпляров между собой не связаны. Т.е. Kva и Pyr не знают о существовании друг друга и не обмениваются никакими данными. У них данные различны, лежат по разным адресам ОЗУ. В Pyr сторона квадрата не задана, все целочисленные поля при создании экземпляра при игнорировании инициализируются нулями, что и имеете.

Bombucho писал(а):Ну как я понимаю в конструкторе мы должны указать переменные которые будут браться с поля ввода, в нашем случае только длина стороны квадрата и длина апофемы

Только и для пирамиды вы должны задавать сторону квадрата или сам квадрат, а там внутри уже из квадрата выдергивать сторону.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Компилирует без ошибок,но...

Сообщение AlphaBlend » 19.06.2016 01:16:46

Bombucho Попробуйте написать класс "пирамида" и сделать частным случаем его "квадрат" . Тогда , может быть , задача проще решится ? Кстати есть возможность прочитать задачу ? :roll: Без кода ( или код к ней прилагается ? )

Добавлено спустя 2 минуты 5 секунд:
просто лично мне непонятно как можно перегрузить конструктор от совсем другого класса. Квадрат имеет другие свойства , методы.. Пирамида - другие ... Я не понимаю , если честно :shock:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Компилирует без ошибок,но...

Сообщение resident » 19.06.2016 01:21:38

Bombucho писал(а):Хм,возможно, сейчас попробую...

Здесь наверное не перегрузка функций с одинаковым именем, а перекрытие (добавление новых действий) родительского метода в наследнике. Это уже словом override. Это вроде называется "наследованием". Один из трех китов ООП.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Компилирует без ошибок,но...

Сообщение AlphaBlend » 19.06.2016 01:23:40

resident для override классы должны быть только виртуальными , если не ошибаюсь ?

Добавлено спустя 1 минуту 29 секунд:
методы класса то есть ( virtual , dynamic ) :roll:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Компилирует без ошибок,но...

Сообщение Bombucho » 19.06.2016 01:26:38

resident писал(а):
Bombucho писал(а):Хм,возможно, сейчас попробую...

Здесь наверное не перегрузка функций с одинаковым именем, а перекрытие (добавление новых действий) родительского метода в наследнике. Это уже словом override. Это вроде называется "наследованием". Один из трех китов ООП.

Да, именно эта задача из раздела "Наследование и полиморфизм" я использовал override, но наверное упустил момент, что его нужно использовать после constructor Create. ...
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Компилирует без ошибок,но...

Сообщение resident » 19.06.2016 01:27:13

zub писал(а):LCL прекрасно умеет логи

А вот ничего не получается у меня, может на пальцах покажете как?
з.ы. Я и TEventLog пробовал, тоже не идет.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Компилирует без ошибок,но...

Сообщение Bombucho » 19.06.2016 01:28:23

AlphaBlend писал(а):Bombucho Попробуйте написать класс "пирамида" и сделать частным случаем его "квадрат" . Тогда , может быть , задача проще решится ? Кстати есть возможность прочитать задачу ? :roll: Без кода ( или код к ней прилагается ? )

Добавлено спустя 2 минуты 5 секунд:
просто лично мне непонятно как можно перегрузить конструктор от совсем другого класса. Квадрат имеет другие свойства , методы.. Пирамида - другие ... Я не понимаю , если честно :shock:

Да, вот условие
" Родительский класс – квадрат со стороной а=2. Вычислить его площадь и периметр.
Производный класс – пирамида с апофемой h=4. Вычислить ее полную поверхность.
"
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Компилирует без ошибок,но...

Сообщение resident » 19.06.2016 01:41:31

Шаг 1 (ничего перегружать не пришлось)
Код: Выделить всё
TPyramida=class(TKvadrat)
    ...
    constructor Create(k:TKvadrat; ap:integer);
....
constructor TPyramida.Create(k:TKvadrat; ap:integer);
begin
  inherited Create(k.Storona);
  FApofema:= ap;
end;
Последний раз редактировалось resident 19.06.2016 01:42:54, всего редактировалось 1 раз.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Компилирует без ошибок,но...

Сообщение Bombucho » 19.06.2016 01:42:40

resident писал(а):
Bombucho писал(а):При это в поле сторона квадрата я ввел 2 см, а в поле апофема пирамиды 4 см

Некоторые люди видят только то, что им напишут дюймовыми буквами и подсунут под нос. Или как-то так в Унесенных Ветром было.
Еще раз. Вы ввели сторону квадрата, создали сам экземпляр квадрата и... И дальше вы на него забили, вы ни этот квадрат, ни тем более его сторону нигде больше не используете.
Если еще понятней, то удалите переменные k, kva и ничего не изменится.

Как бы вот ваши классы показывают как нужно обрабатывать данные. Но вот сами данные экземпляров между собой не связаны. Т.е. Kva и Pyr не знают о существовании друг друга и не обмениваются никакими данными. У них данные различны, лежат по разным адресам ОЗУ. В Pyr сторона квадрата не задана, все целочисленные поля при создании экземпляра при игнорировании инициализируются нулями, что и имеете.

Bombucho писал(а):Ну как я понимаю в конструкторе мы должны указать переменные которые будут браться с поля ввода, в нашем случае только длина стороны квадрата и длина апофемы

Только и для пирамиды вы должны задавать сторону квадрата или сам квадрат, а там внутри уже из квадрата выдергивать сторону.


А почему Kva и Pyr не знаю о существовании друг друга, я же вроде как указал USES юнит родителя, а насчет квадрата, вот мы задаем в поле сторону квадрата она автоматов находит ее площадь и периметр и этот найденный периметр уже должна использоваться в UNIT3(пирамида) и там уже по формуле 1/2*P*L+Sосн (p-периметр(квадрата),l-апофему ), а как тогда сделать чтобы Kva и Pyr узнали друг о друге
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 231

Рейтинг@Mail.ru