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
Seite 1 von 3  1 23      
Bladefire

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

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

  Alt 28. Jul 2014, 07:11
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

Geändert von Bladefire (28. Jul 2014 um 08:44 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
 
#2

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

  Alt 28. Jul 2014, 08:01
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
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
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, 08:49
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
  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, 08: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
 
#5

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

  Alt 28. Jul 2014, 09: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 09:14 Uhr)
  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 28. Jul 2014, 11: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
 
#7

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

  Alt 28. Jul 2014, 11: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
 
#8

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

  Alt 28. Jul 2014, 12: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
 
#9

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

  Alt 30. Jul 2014, 11: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
 
#10

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

  Alt 30. Jul 2014, 11: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
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 15:23 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