Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  Konstruktorkette läuft nicht wie gedacht  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
AnanasPilot
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2017
Beiträge: 6
Beitrag AnanasPilot Mitglied 11:37:41 07.12.2017   Titel:              Zitieren

manni66 schrieb:
...


Achso, doch nochmal was anderes :confused:
Die Konstruktorkette wurde mir so von meinem Dozenten vorgestellt, wie ich sie in meinem Beispielprogramm geschrieben habe. Muss das morgen auch sehr wahrscheinlich in einem Testat verwenden.
Wir bekommen dann aber auch vorgefertigte Klassen und müssen dann Methoden erweitern/schreiben.

asdsaddsasds schrieb:
...


Und deine Lösung mit unique_ptr ist dann reines c++?

Mein Dozent ist sehr bemüht darin die Dinge überschaubar zu halten. Ich kann noch nicht einordnen was Sinn ergibt und was nicht.
Vielleicht wird alles auch erst spezieller wenn es in die Wahlmodule geht. Keine Ahnung :confused:
asdsaddsasds
Unregistrierter




Beitrag asdsaddsasds Unregistrierter 11:47:08 07.12.2017   Titel:              Zitieren

AnanasPilot schrieb:
Und deine Lösung mit unique_ptr ist dann reines c++?


Ich bin jetzt nicht so bewandert in C oder C++, daher sollte man mich ruhig korrigieren.

Als erstes solltest du alle Objekte, die du mit new anlegst auch mit delete löschen. Sonst entsteht ein memory leak. Dein Code sollte dann eher so aussehen.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// erst einmal mit nullptr initialisieren.
hallo2 *hip = nullptr;
 
try
{
  // versuche es zu erzeugen.
  hip = new hallo2(h1, h2);
catch( std::exception const & e )
{
  // Fehlerbehandlung falls das Objekt nicht erzeugt werden konnte
}
 
// Prüfen ob dein Objekt richtig angelegt werden konnte.
if( nullptr == hip )
{
  // Falls nicht, hier kommt Fehlerbehandlung
}
 
// Hier kommt der Arbeitscode
 
 
// Wenn du fertig bist
 
// Prüfen ob nicht eine andere Instanz aufgeräumt hat.
if( hip != nullptr )
{
  // falls nicht, dann räumst du auf.
  delete hip;
  hip = nullptr
}


Für doofe wie mich ist das ganze zu kompliziert. Deswegen verwende ich entweder shared_ptr wenn viele dieses Objekt nutzen oder unique_ptr, wenn ich sicher bin, dass nur ich das Objekt nutze. Es wird dann automatisch aufgeräumt :live:

Dann wären da noch Nebenbaustellen
Schlangenmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.11.2008
Beiträge: 447
Beitrag Schlangenmensch Mitglied 11:58:44 07.12.2017   Titel:              Zitieren

Kurze Ergänzung zu asdsaddsasds Aussage:
Du musst den Pointer nach dem delete nicht ein nullptr zuweisen. (Eventuell wenn du den gleichen Pointer nochmal verwenden willst, aber das ist eher untypisch).

Aber in c++ solltest du dir angewöhnen sogenannte smart pointer zu Verwenden, wenn du dynamisch angelegten Speicher benötigst (std::unique_ptr oder std::shared_ptr).

In deinem Fall, AnanasPilot, ist die Frage warum überhaupt dynamisch. Warum nicht einfach:

C++:
hallo2 hip(h1, h2);
out
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.10.2017
Beiträge: 45
Beitrag out Mitglied 12:42:59 07.12.2017   Titel:              Zitieren

asdsaddsasds schrieb:
AnanasPilot schrieb:
Wo mische ich denn C mit C++ ?

Hier
C++:
hallo2 *hip = new hallo2(h1, h2);
Das ist C++. C hat kein new. Was du meinst ist low level C++.

_________________
Linda Scott by the 50's
C++ Bücher, C++ Reference, Online Compiler, C++ in Assembler, Englisch Übersetzer
asdsaddsasds
Unregistrierter




Beitrag asdsaddsasds Unregistrierter 12:56:28 07.12.2017   Titel:              Zitieren

out schrieb:
asdsaddsasds schrieb:
AnanasPilot schrieb:
Wo mische ich denn C mit C++ ?

Hier
C++:
hallo2 *hip = new hallo2(h1, h2);
Das ist C++. C hat kein new. Was du meinst ist low level C++.


Ist es nicht das äquivalent zu (x)alloc?
Schlangenmensch
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.11.2008
Beiträge: 447
Beitrag Schlangenmensch Mitglied 13:17:32 07.12.2017   Titel:              Zitieren

asdsaddsasds schrieb:
out schrieb:
asdsaddsasds schrieb:
AnanasPilot schrieb:
Wo mische ich denn C mit C++ ?

Hier
C++:
hallo2 *hip = new hallo2(h1, h2);
Das ist C++. C hat kein new. Was du meinst ist low level C++.


Ist es nicht das äquivalent zu (x)alloc?


Tatsächlich nicht. Zumindest zu dem malloc / free, wie ich es kenne.
Mit new / delete wird der entsprechende Konstruktor aufgerufen und die nötigte Speichergröße automatisch bestimmt. Das hast du bei malloc und free nicht.
asdsaddsasds
Unregistrierter




Beitrag asdsaddsasds Unregistrierter 15:26:12 07.12.2017   Titel:              Zitieren

Schlangenmensch schrieb:
asdsaddsasds schrieb:
out schrieb:
asdsaddsasds schrieb:
AnanasPilot schrieb:
Wo mische ich denn C mit C++ ?

Hier
C++:
hallo2 *hip = new hallo2(h1, h2);
Das ist C++. C hat kein new. Was du meinst ist low level C++.


Ist es nicht das äquivalent zu (x)alloc?


Tatsächlich nicht. Zumindest zu dem malloc / free, wie ich es kenne.
Mit new / delete wird der entsprechende Konstruktor aufgerufen und die nötigte Speichergröße automatisch bestimmt. Das hast du bei malloc und free nicht.


Stimmt :live: Ist bei mir schon etwas länger her, danke für die Erinnerung :D
AnanasPilot
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.12.2017
Beiträge: 6
Beitrag AnanasPilot Mitglied 23:01:37 07.12.2017   Titel:              Zitieren

Danke für alle Antworten :)
zufallswert
Unregistrierter




Beitrag zufallswert Unregistrierter 23:49:28 07.12.2017   Titel:   Re: Konstruktorkette läuft nicht wie gedacht            Zitieren

asdsaddsasds schrieb:

Dein Code verursacht deswegen ein Memory-Leak. Besser wäre folgendes
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <memory>
#include <cstdlib>
 
int main( int argc , char ** argv )
{
  std::string h1( "1" );
  std::string h2( "2" );
 
  std::unique_ptr< hallo2 > hip( h1 , h2 );
  std::cout << hip->getHallo1() << std::endl;
 
  system( "pause" );
 
  return EXIT_SUCCESS;
}


den smart pointer kann man sich sparen:
C++:
int main( int argc , char ** argv )
{
[...]
  hallo2 hip( h1 , h2 );
  std::cout << hip.getHallo1() << std::endl;
[...]
}
Jockelx
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.12.2009
Beiträge: 1340
Beitrag Jockelx Mitglied 23:54:13 07.12.2017   Titel:              Zitieren

Sollte man sich sparen. Steht da hoffentlich auch nur, wegen des noch unsinnigeren news im Anfangspost.
C++ Forum :: C++ (alle ISO-Standards) ::  Konstruktorkette läuft nicht wie gedacht  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.