Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013) (https://www.delphipraxis.net/181230-und-c-speicherreservierung-von-instanzen-obijekten-ms-visual-studio-2013-a.html)

Bladefire 28. Jul 2014 06:11

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

ich lerne gerade ein bisschen C++, jedoch verstehe ich die Speicherreservierung von Obijekten/Instanzen nicht so ganz.

Am besten zeige ich es an einem Beispiel:

// CKlasse ist eine Klasse und hat eine memberfunktion namens "anzahl()"

c++
___
Code:
int aktuelleanzahl = 0;

CKlasse *Klassenvariable = NULL;

Klassenvariable = new CKlasse // der Klassenvariable wird eine (referenz?) adresse zugewiesen.

aktuelleanzahl = Klassenvariable.anzahl(); // Wieso braucht man hier kein "*"? Ich dachte das man sonst nur auf die speicherdresse(?) zugreifen kann.

delete aktuelleanzahl;

  // Beispiel aus einem anderen Tuturial
/* 
int *zahl = Null;

zahl = new int;

*zahl = 100; //! hier braucht man den "*" wieder. warum hier schon aber bei "aktuelleanzahl = Klassenvariable.anzahl();" nicht?

delete zahl;
*/
Wie kann man dies am besten mit Delphi vergleichen?
Delphi:
Delphi-Quellcode:
var
anzahl: integer;
Klassenvariablenname: TKlasse;
begin
    Klassenvariablenname := TKlasse.Create()
    anzahl := Klassenvariablenname.anzahl;
    anzahl.free;
end;
- Bitte beantwortet mir meine zwischenfragen die ich neben den quellcode als kommentar geschrieben habe.

- Bitte beantwortet mir diese Frage: Welche Zeilen von Delphi wären die gleichen wie in c++? z. B:
("Klassenvariablenname := TKlasse.Create()" in delphi ist das gleiche wie "CKlasse *Klassenvariable = NULL;")

- Bitte beantwortet mir diese Frage: Welche Zeilen von c++ wären die gleichen wie in delphi? z. B:
"CKlasse *Klassenvariable = NULL;" in delphi ist das gleiche wie ("Klassenvariablenname := TKlasse.Create()")

Bitte fragt nach wenn ihr nicht genau verstanden habt was ich eigentlich will (habe es ein bisschen kompliziert ausgedrückt)

Danke für eure mühen.

Lg Simon

Sir Rufo 28. Jul 2014 07:01

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
Es wäre herzallerliebst, wenn du Quelltext auch in Code-Tags/Delphi-Tags setzen würdest.

Und via Google findet man z.B. das hier
http://de.m.wikibooks.org/wiki/C++-P...emente/_Zeiger

Bladefire 28. Jul 2014 07:49

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
Danke für deine schnelle antwort.

Leider löst der link mein problem nicht. Bis jetzt konnte ich alles in c++ mit delphi vergleichen. Nun würde ich gerne wissen wie man den jeweiligen Quellcode den ich oben angegeben habe, in der jeweils anderen sprache schreibt.

Lg Simon

Mikkey 28. Jul 2014 07:59

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
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();

Sir Rufo 28. Jul 2014 08:11

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
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.

Bladefire 28. Jul 2014 10:21

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
@ 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

Mikkey 28. Jul 2014 10:56

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
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.

Bladefire 28. Jul 2014 11:51

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
Danke für deine hilfe.

Das war alles was ich wissen wollte.

lg simon

Bladefire 30. Jul 2014 10:27

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
@ 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

Mikkey 30. Jul 2014 10:55

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr.
Seite 1 von 3  1 23      

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