AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versuche Objektorientierung zu lernen

Ein Thema von foerster7892 · begonnen am 18. Feb 2012 · letzter Beitrag vom 19. Feb 2012
Antwort Antwort
Seite 1 von 3  1 23      
foerster7892

Registriert seit: 10. Okt 2007
Ort: Brieskow-Finkenheerd
181 Beiträge
 
#1

Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 20:23
Delphi-Version: 5
Hi,

ich hab jetzt verschiedene Tutorials gelesen und verstehe meine Fehler trotzdem nicht könntet ihr mir vllt helfen?

unit 1:
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Rechnen:TRechnen;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Rechnen:=TAddition.create;
  Label1.caption:=FlaotToStr(Rechnen.calcit(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text)));
  Rechnen.Destroy;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Rechnen:=TSubtraktion.create;
  Label1.caption:=FloatToStr(Rechnen.calcit(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text)));
  Rechnen.Destroy;
end;

end.
unit2:
Delphi-Quellcode:
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  TRechnen=class(TObject)
    public
      constructor create;
      function calcit(a,b:real):real;virtual;
  end;

  TAddition=class(TRechnen);
    public
      constructor create;
      function calcit(a,b:real):real;override;
  end;

  TSubtraktion=class(TRechnen);
    public
      constructor create;
      function calcit(a,b:real):real;override;
  end;

var calcs:TRechnen;
implementation


  function TAddition.calcit(a,b:real):real;
  begin

    result:=a+b;
  end;

  function TSubtraktion.calcit(a,b:real):real;
  begin
    result:=a-b;
  end;

end.
Ja die Fehlermeldung ist denke ich egal(da sie auch nichts hilfreiches aussagt)

Ich möchte halt 2 Zahlen eingeben und dann als Ergebnis entweder den Summanden oder die Differenz bekommen. Das alles mit einer Klasse TRechnen welche weitervererbt wird an die Klassen TAddition und TSubtraktion.

Ich hoffe ihr könnt mir dies erklären.

Außerdem würde ich mich freuen wenn mir jemand nocheinmal mit eigenen Worten den Sinn von inhirated und die genaue Funktionsweise des constructors erklären könnte. (Den constructor braucht man irgendwie um Speicher für die klasse zu reservieren und sie zu erstellen, was bedeutet dies genau? Und inherited ka wird halt manchmal auch hingeschrieben und manchmal nicht...)

PS.: Ich benutze Lazarus falls es da irgendetwas spezielles zu beachten gibt.
mfg
foerster7892

Geändert von foerster7892 (18. Feb 2012 um 21:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 20:38
Ja die Fehlermeldung ist denke ich egal(da sie auch nichts hilfreiches aussagt)
Oh doch, sie sagt eine Menge aus. Lass mich raten: Der Compiler findet die Implementierung von TRechnen.calcit nicht? Und alle drei Konstruktoren auch nicht?
Die Glaskugel sagt "Forward declaration not solved: ....".

Zitat:
Außerdem würde ich mich freuen wenn mir jemand nocheinmal mit eigenen Worten den Sinn von inhirated und die genaue Funktionsweise des constructors erklären könnte. (Den constructor braucht man irgendwie um Speicher für die klasse zu reservieren und sie zu erstellen, was bedeutet dies genau? Und inherited ka wird halt manchmal auch hingeschrieben und manchmal nicht...)
inherited bedeutet, dass die gleichnamige Methode der Elternklasse aufgerufen wird. Man kann hinter das inherited auch noch den Methodennamen und die Parameterliste schreiben, falls sich eines von beiden von der aktuellen Methode unterscheidet.

Zum Konstruktor: Es gibt im Speicher einen bestimmten Bereich, der sich "Heap" nennt. Alle Klasseninstanzen werden dort erstellt. Der Heapspeicher ist aber nicht sofort für die Anwendung verfügbar, sondern er muss ihr erst vom Betriebssystem zugewiesen werden. Auf unterster Ebene geht das mit malloc() und realloc(), aber das ist eine ganz schöne Frickelei. Der Konstruktor nimmt dir das ein bisschen ab und besorgt den Speicher für dich. Das tut er schon in der Basisklasse TObject, also wenn du immer brav inherited benutzt*, musst du dich darum nicht groß kümmern und kannst den Konstruktor allein dafür benutzen, die Felder zu initialisieren.

Zitat:
PS.: Ich benutze Lazarus falls es da irgendetwas spezielles zu beachten gibt.
In der Hinsicht eigentlich nicht. Es gibt ein paar Dialektunterschiede, aber die liegen woanders. Und die Fehlermeldungen lauten eben etwas anders als bei Delphi.


Oh und noch was: In Unit1 rufst du Rechnen.Destroy direkt auf. Tu das nicht! Jetzt im Moment geht das vielleicht noch gut, aber wenn die Programme mal komplexer werden, kann das schon eine potentielle Fehlerquelle werden. Nimm stattdessen Rechnen.Free!



*) Bei Konstruktor und Destruktor werden sie auch automatisch ergänzt, wenn sie fehlen, von daher nicht allzu schlimm, wenn man sie dort vergisst.

Geändert von implementation (18. Feb 2012 um 20:46 Uhr)
  Mit Zitat antworten Zitat
foerster7892

Registriert seit: 10. Okt 2007
Ort: Brieskow-Finkenheerd
181 Beiträge
 
#3

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 20:51
zur Fehlermeldung:
nein sie sagt: Unit2.pas(19,7) Fatal: Syntax error, "=" expected but "CONSTRUCTOR" found

So danke für die kurze Erklärung.

Nur nochmal zum Verständnis:
Wenn ich inherited benutze dann greife ich auf die Funktion der Mutterklasse zu also:

constructor TAddtion.create;
begin
inherited;
end;

jetzt würde ich also wenn ich:

Rechnen:=TAddition.create;
Rechnen.calcit(a,b);

und dies würde bei mir dann in der Mutterklasse landen und somit würde nichts passieren da diese ja in meinem Bsp. leer ist.

...und warum soll ich destroy nicht verwenden, in versch. Tutorials wurde Destroy verwendet in anderen free. Where is the difference?

...und wann muss ich überhaupt constructor create; schreiben und wann nicht und wo muss ich dass jeweils einfügen?
mfg
foerster7892

Geändert von foerster7892 (18. Feb 2012 um 21:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 20:58
zur Fehlermeldung:
nein sie sagt: Unit2.pas(19,7) Fatal: Syntax error, "=" expected but "CONSTRUCTOR" found
Das kommt daher, dass du hinter class(TRechnen) beide Male ein Semikolon hast. Das heißt für den Compiler: "Hier ist der Typ zuende" - und daraufhin liest er 'public' und denkt, du willst noch einen weiteren Typen namens "public" deklarieren. Nimm die Semikola mal weg.

Geändert von implementation (18. Feb 2012 um 21:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 21:04
zur Fehlermeldung:
nein sie sagt: Unit2.pas(19,7) Fatal: Syntax error, "=" expected but "CONSTRUCTOR" found
Das kommt daher, dass du hinter class(TAddition) und class(TSubtraktion) Semikola hast. Das heißt für den Compiler: "Hier ist der Typ zuende" - und daraufhin liest er 'public' und denkt, du willst noch einen weiteren Typen namens "public" deklarieren. Nimm die Semikola mal weg.
Du meinst
TAddition=class(TRechnen); // <- das da und
TSubtraktion=class(TRechnen); // <- das da Des Weiteren finde ich noch
Delphi-Quellcode:
  Label1.caption :=
    FlaotToStr( // das heißt FloatToStr :o)
      Rechnen.calcit(
        // 1. Parameter
        StrToFloat( // erwartet genau 1 Str-Parameter
          Edit1.Text,
          Edit2.Text // wozu also der 2. Parameter hier ???
        )
        // 2. Parameter ... wo ist der ???
      )
    );
Aus diesen Gründen kommen bei mir auch immer sehr viele Leerzeichen in den Code - auch wenn der Styleguide diese verpönt - denn m.E. sieht man dann viel eher, dass da was nicht passt
Delphi-Quellcode:
...
Label1.Caption:=FloatToStr(Rechnen.CalcIt(StrToFloat(Edit1.Text, Edit2.Text)));
...
Label1.Caption := FloatToStr( Rechnen.CalcIt( StrToFloat( Edit1.Text, Edit2.Text ) ) );
...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Feb 2012 um 21:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 21:11
Du meinst
TAddition=class(TRechnen); // <- das da und
TSubtraktion=class(TRechnen); // <- das da
Genau, danke für den Hinweis, ist korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 21:34
Ist public denn nicht ein "reserviertes Wort"?

So wie es aussieht, wird es (nach dem ; ) dennoch als Typenbezeichner erkannt und deswegen wird danach auch das = erwartet.
$2B or not $2B

Geändert von himitsu (18. Feb 2012 um 21:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 21:39
Ist public denn nicht ein "reserviertes Wort"?
Es gibt Schlüsselwörter, die sind nur in einem bestimmten Kontext reserviert. Wie ja bspw. auch read und write .
Public kann gut eines davon sein, denn wo braucht man Public auch sonst außer in Klassen- und Nostalgie-Object-Deklarationen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 21:40
Ist public denn nicht ein "reserviertes Wort"?

So wie es aussieht, wird es (nach dem ; ) als Typenbezeichner erkannt und deswegen wird danach auch das = erwartet.
Ich denke das ist nur so ein "halb reserviertes" Wort, denn public macht ja nur Sinn im Kontext einer Typ-Deklaration, und die ist ja durch das ; schon abgeschlossen. Darum kann der Compiler das eben nicht richtig einsortieren

EDIT: zu langsam ... na gut
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
foerster7892

Registriert seit: 10. Okt 2007
Ort: Brieskow-Finkenheerd
181 Beiträge
 
#10

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 21:42
hi,
ja dass mit der Parameterübergabe bei den Funktionen war nen Tippfehler.

ich hatte oben die Antwort noch editiert wie ich ergänzt hatte, da ihr so schnell geantwortet habt würde ich mich nun noch über Antworten auf die obigen Fragen freuen.

Außerdem geht es leider noch nicht wenn ich den Fehler mit StrToFloat behoben habe, da dann der vorhergesagte Fehler auftritt.(Forward declaration not solved... was bedeutet dass wie behebe ich es?)

Public ist reserviert und bedeutet soweit ich weiß dass die Methoden die unter Public definiert werden öffentlich sind und somit auch aus anderen Units/Klassen gesehen werden können und ich darauf zugreifen kann.



PS:
"Btw. "free" würde ich in Ruhe lassen. Überschreibe lieber Destroy." habe ich in anderen Foren gefunden?
mfg
foerster7892

Geändert von foerster7892 (18. Feb 2012 um 21:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz