AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Pointer-Eigenschaft einer Klasse: Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

Ein Thema von little-x · begonnen am 7. Nov 2007 · letzter Beitrag vom 7. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
little-x

Registriert seit: 13. Apr 2007
Ort: Brandenburg
60 Beiträge
 
Delphi 6 Enterprise
 
#1

Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:14
Hallo,

angenommen ich haben 2 Klassen, die im Interface-Teil einer Unit direkt untereinander stehen:

Delphi-Quellcode:
Type TFather = Class
    vorname: string;
    alter: integer;
end;

Type TChild = Class
    vorname: string;
    alter: integer;
    Vater: Pointer; // <- hier kommt das Problem; hier soll der Papa rein.
end;
Im weiteren Verlauf erzeuge ich jeweils ein Objekt (Vater zuerst), mit Create und belege die Werte. Dabei kommt an einer Stelle eine Fehlermeldung:
Delphi-Quellcode:
      VaterObject:= TFather.Create;
      VaterObject.vornamename:= 'Horst';
      VaterObject.alter:= 30;

      ChildObject= TChild.Create;
      VaterObject.vornamename:= 'Horstsohn';
      VaterObject.alter:= 3;
      ChildObject.Vater:= VaterObject; // <- Hier kommt die Fehlermeldung die ich nicht verstehe!
Und zwar kommt an der gekennzeichneten Stelle eine Speicher-Zugriffsverletzung.
Um folgendes Zitat vorweg zu nehmen:
Zitat:
Warum nimmst Du nicht TFather anstatt Pointer?
Das hier ist nur ein Beispiel. Mein Programm ist sehr viel komplexer, ich möchte niemanden verwirren. Ich weiß halt nicht immer den Datentyp, sondern nur dass es immer eine "Datenstruktur" ist (also Objekte irgendwelcher Klassen). Später kann ich diese mit TClassname(Child.Vater).blabla dereferenzieren.
Wo es super funktioniert, ist beim TTreeItem. Hier gibt es die Eigenschaft Dataointer. Funktioniert einfandfrei:
tvitem.data:= xy;//beliebige Objektstruktur Weiß jemand was ich hier falsch mache?

Grüße!
manchmal machts mich mürbe
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#2

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:17
Child.Vater := @VaterObjekt; Du willst ja schliesslich die Adresse des Objektes in den Pointer stecken.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
little-x

Registriert seit: 13. Apr 2007
Ort: Brandenburg
60 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:20
Funktioniert auch nicht (gleiche Fehlermeldung).

Danke trotzdem
manchmal machts mich mürbe
  Mit Zitat antworten Zitat
little-x

Registriert seit: 13. Apr 2007
Ort: Brandenburg
60 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:26
Was funktioniert ist:
Delphi-Quellcode:
var tmp_ptr: Pointer;

...
     tmp_ptr:= @VaterObject;
Hier kommt dann wierder der Fehler:
ChildObject.Vater:= tmp_ptr; Kann es sein dass die Klasseneigenschaft irgendwie geschützt ist?
Sollte ich sie vielleicht als Public deklarieren?
Oder gibt es irgendwelche Sperren bzw. Restriktionen, bei denen nicht mehrere Objekte in unterschiedllichen Klassen sich gegenseitig aufrufen dürfen?
manchmal machts mich mürbe
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:31
Bei D6 muss man bei Pointern IHMO noch etwas typecasten.
Versuch doch mal diese Sachen:
Delphi-Quellcode:
ChildObject.Vater:= pointer(VaterObject);
//bzw.
ChildObject.Vater:= pointer(@VaterObject);
//wobei das eigentlich egal sein sollte
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#6

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:36
Zitat von little-x:
Kann es sein dass die Klasseneigenschaft irgendwie geschützt ist?
Sollte ich sie vielleicht als Public deklarieren?
Oder gibt es irgendwelche Sperren bzw. Restriktionen, bei denen nicht mehrere Objekte in unterschiedllichen Klassen sich gegenseitig aufrufen dürfen?
Uh. erm.. Du willst NIE von extern auf Felder der Klasse zugreifen. Was Du willst ist ein Property erstellen, welches den Zugriff auf das Feld kapselt.

Delphi-Quellcode:
  TChild = Class
    vorname: string;
    alter: integer;
    FVater: Pointer;
  public
    property Vater: Pointer read FVater write FVater; // <-- fehlt
  end;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#7

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:37
Eigentlich müsste es genauso funktionieren, wie du es gemacht hast - cih verwende in einem Projekt genau die gleiche Struktur und das klappt wunderbar (das mit dem @ kannst du imho auch vergessen, da Objekte eh nur als Pointer zugewiesen werden).

Daher die Frage: Hast du das Beispiel auch genau in der einfachen Form, wie du sie hier reingestellt hast, mal ausprobiert? Ich würde ja eher vermuten, dass der Fehler woanders liegt, da gerade beim Zuweisen einer Speicheradresse an einen Pointer nix passieren sollte. Ist das, was hier vom Typ TChild ist, richtig deklariert? Rufst du vom richtigen Objekt den constructor auf? Würde vermuten, dass eher in dem Bereich ein Fehler liegt, denn offenbar kann auf die Eigenschaft "fahther" nicht zugegriffen werden.

Das könnte vielleicht so passieren:

Delphi-Quellcode:
procedure irgendwas;

var vadder: TFahther;
    kind: TChild;

begin
  vadder:=TFahther.Create;
  // irgendwelche Werte an den Vater...

  kind:=TChild(Tfahther.Create); // machst du in deinem komplexeren Projekt irgendwie sowas?
  kind.vater:=vadder; // ...denn in dem Fall müsste genau dein Fehler kommen.
end;
Mal so als Idee. Allerdings gerade ungetestet.

Bis denn
Bommel
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:43
Dein Minmalbeispiel lässt sich bei mir anstandslos kompilieren (nach Änderung der Eigenschaft 'vornamename'...) und läuft auch ohne Fehlermeldung durch. Das Problem liegt also wahrscheinlich an etwas anderem.
  Mit Zitat antworten Zitat
little-x

Registriert seit: 13. Apr 2007
Ort: Brandenburg
60 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:46
Zitat:
Mal so als Idee. Allerdings gerade ungetestet.
@Bbommel: Nun ja, um ehrlich zu sein mache ich es eigentlich genauso. Du meinst, dass dann der Fehler kommen muss? Woran liegt das in dem Fall?

ansonsten, das mit der fehlenden Property klingt logisch, ich werd es ausprobieren.

Ich prüfe mal nochmal ob der Fehler nicht vielleicht doch woanders liegt. Bis hierher Danke an alle, aber lasst mal "kurz" locker... will nicht dass sich noch mehr andere den Kopf zerbrechen und dabei Äpfel mit Birnen vergleichenm, weil der Fehler bei mir liegt...
manchmal machts mich mürbe
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#10

Re: Pointer-Eigenschaft einer Klasse: Zugriffsverletzung

  Alt 7. Nov 2007, 14:54
Zitat von little-x:
Zitat:
Mal so als Idee. Allerdings gerade ungetestet.
@Bbommel: Nun ja, um ehrlich zu sein mache ich es eigentlich genauso. Du meinst, dass dann der Fehler kommen muss? Woran liegt das in dem Fall?
Naja, weil für die Speicherzuweisung (und ggf. auch für die Nutzung von Methoden, Stichwort: vrtuelle Methoden) wichtig ist, welchen Constructor du aufrufst. In deinem Fall ist es derjenige vom Objekt Vater, in dem es die Eigenschaft "vater" aber gar nicht gibt. Wenn du nun dieser Eigenschaft einen Wert zuweisen willst, dann geht das schief, weil für die Eigenschaft kein Speicher vorhanden ist.

Das merkst du in meinem Beispiel aber erst zur Laufzeit, weil du das Kind ja als TChild deklariert hast: Editor und Compiler werden sich also nicht über die fehlende Eigenschaft "vater" beschweren. Und wegen des Typecasts lassen sie dir auch durchgehen, dass du den falschen Constructor aufrufst.

Hm, hoffe, ich hab das 1. richtig und 2. verständlich erklärt.

Bis denn
Bommel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:19 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