AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Thema durchsuchen
Ansicht
Themen-Optionen

und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

Ein Thema von Bladefire · begonnen am 28. Jul 2014 · letzter Beitrag vom 1. Aug 2014
Antwort Antwort
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#1

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 28. Jul 2014, 07:59
Du solltest die Begriffe Referenz und Zeiger nicht durcheinanderbringen.

Zitat:
Wieso braucht man hier kein "*"?
Man braucht es! Wenn irgendein schrottiger Compiler den Zugriff ohne erlaubt, dann solltest Du das als Fehler betrachten. ein Zeiger ist ein Zeiger und muss auch so benutzt werden.

Normalerweise verwendet man in C++ aber statt "*" und "." "->", dann wird auch besser deutlich, was man da tut.

Code:
pKlassenvariable->anzahl();
  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
 
#2

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 28. Jul 2014, 08:11
Hier mal dein C++ Code in Delphi gefasst
Delphi-Quellcode:
program dp_181230;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  CKlasse = class
  public
    function anzahl : Integer;
  end;

  { CKlasse }

function CKlasse.anzahl : Integer;
begin
  Result := 42;
end;

procedure Foo;
var
  aktuelleanzahl : Integer; // eine einfache Variable
  Klassenvariable : CKlasse; // eine Klassen-Referenz-Variable
  zahl : PInteger; // Ein Zeiger auf einen Integer
begin
  // int aktuelleanzahl = 0;
  aktuelleanzahl := 0;
  // CKlasse *Klassenvariable = NULL;
  Klassenvariable := nil;
  // Klassenvariable = new CKlasse
  Klassenvariable := CKlasse.Create;
  // aktuelleanzahl = Klassenvariable.anzahl();
  aktuelleanzahl := Klassenvariable.anzahl( );
  // delete aktuelleanzahl;
  // DELPHI: Variablen kann man überschreiben, aber der Speicher sollte nicht freigebeben werden

  Klassenvariable.Free; // In Delphi notwendig, sonst Speicherleck

  // int *zahl = Null;
  zahl := nil;
  // zahl = new int;
  new( zahl );
  // *zahl = 100;
  zahl^ := 100;
  // delete zahl;
  FreeMem( zahl );
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  try
    Foo;
  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

end.
In Delphi erfolgt die Dereferenzierung bei Klassen-Referenz-Variablen automatisch, daher ist dort keine explizite Behandlung notwendig.
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 (28. Jul 2014 um 08:14 Uhr)
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#3

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 28. Jul 2014, 10:21
@ Mikkey, ich benute MS visual studio 2013. Möglicherweise habe ich ein falsches beispiel genannt wann man ihn nicht braucht.

Möglicherweise ist hier die verwendung korrekt (wenn ja, warum?):

Code:
#include <iostream>

using namespace std;

class CSpieler
{
private:
   char m_Name[30];
   int m_status;

public:

   void init();
   void zeigedaten();

};

void CSpieler::init()
{
   cout << "Bitte Namen eingeben:" << endl;
   cin.ignore();
   cin.get(m_Name, 29);
   m_status = 10;


}

void CSpieler::zeigedaten()
{
   cout << "Name: " << m_Name << endl;
   cout << "Status: " << m_status << endl;
   cout << endl;


}

int main()
{
   CSpieler *pSpielerliste = NULL;

   int anzahl;

   cout << "Wie viele Spieler?" << endl;
   cin >> anzahl;

   pSpielerliste = new CSpieler[anzahl];

   for (int i = 0; i < anzahl; i++)
   {
      cout << "Spieler " << i + 1 << endl;
      pSpielerliste[i].init();
      cout << endl;
   }

   for (int j = 0; j < anzahl; j++)
   {
      cout << "Spieler: " << j + 1 << endl;
      pSpielerliste[j].zeigedaten();
      cout << endl;
   }

   delete[] pSpielerliste;

}
@ Sir Rufo, herzlichen danke das wollte ich wissen

lg Simon
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#4

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 28. Jul 2014, 10:56
Code:
pSpielerliste = new CSpieler[anzahl];
generiert ein Array von Objekten der Typen CSpieler, auf die Elemente eines solchen Arrays greift man (wie in Delphi auch) mit "[..]" zu.

In C werden Arrays und Pointer gleichartig behandelt:

"*Ptr" und "Ptr[0]" geben einen Zugriff auf denselben Speicher mit demselben Typ, ebenso wie
"(*Ptr).Member", "Ptr->Member" und "Ptr[0].Member".

Wenn Du mehr Anforderungen von Code-Transfers von C(++) nach Delphi hast, solltest du Dich mit den C-Grundlagen beschäftigen.
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#5

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 28. Jul 2014, 11:51
Danke für deine hilfe.

Das war alles was ich wissen wollte.

lg simon
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#6

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 30. Jul 2014, 10:27
@ Sir Rufo, mir sind noch 2 kleine fragen zu diesem Thema eingefallen.

In C++ kann man auch eine Klasse ohne den ganzen Zeiger / referenzen kram erstellen. Wie würde das in Delphi aussehen?

Abgesehen davon würde ich gerne wissen ob diese aussage stimmt:

"Wenn man in c++ die klasse ohne den Zeiger erstellt dan wird sie im stack gespeichert (und existiert nur in der funktion in der die klasse erstellt wurde)."?

Code:
Klasse CKlasse;

CKlasse.variable = 10;

Lg Simon
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#7

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 30. Jul 2014, 10:55
Delphi hat dafür kein Pendant, ebensowenig, wie für das Objektarray aus Deinem anderen Beispiel.

In C# wurde das auch abgeschafft. Beide Sprachen bieten wegen der automatischen Dereferenzierung nicht die Syntax, um Objektreferenzen von Objektvariablen zu unterscheiden.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
779 Beiträge
 
#8

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 30. Jul 2014, 11:23
In C++ kann man auch eine Klasse ohne den ganzen Zeiger / referenzen kram erstellen. Wie würde das in Delphi aussehen?
Wie schon von Mikkey geschrieben, gibt es dafür in Delphi und C# kein Pendant, da dort Objekte (Instanzen von Klassen) immer nur eine Referenz auf einen Speicherbereich sind und man dadurch den Vorteil hat, es nicht explizit dereferenzieren zu müssen (Der Nachteil ist, man muss die Objekte immer selber erstellen / Speicher anfordern (create) und bei Delphi unter Windows auch wieder freigeben).

Am Ehesten kannst due es mir Records in Delphi vergleichen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz