<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[X Instanzen von einem Objekt speichern]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein kleines Programm geschrieben, welches eine Eingabe (Projektname und Stunden) fordert. Nun erstelle ich immer eine Instanz von der Klasse <strong>SProject</strong> und packe dort die Werte rein - mithilfe des Konstruktors.</p>
<p>Die ganzen Instanzen speicher in einem Vector</p>
<pre><code>vector&lt;SProject&gt; Projects;
</code></pre>
<p>. Nun würde mich Interessieren ob der Code so wie ich in geschrieben habe auch vernünftig ist. Und wie sieht es aus mit</p>
<pre><code>delete
</code></pre>
<p>? Ich habe gelesen das ich ein</p>
<pre><code>delete
</code></pre>
<p>nur brauche wenn ich eine Instanz mit dem Schlüsselwort</p>
<pre><code>new
</code></pre>
<p>erstelle.</p>
<p><strong>SProject.h</strong></p>
<pre><code>#ifndef SPROJECT_H
#define SPROJECT_H

#include &lt;string&gt;

class SProject
{
    public:
        SProject();
        SProject(std::string sName, int nHours);
        virtual ~SProject();

        void DisplayProject();
    private:
        std::string m_sName;
        int m_nHours;
};

#endif // SPROJECT_H
</code></pre>
<p><strong>SProject.cpp</strong></p>
<pre><code>#include &lt;iostream&gt;

#include &quot;SProject.h&quot;

SProject::SProject(){
    //ctor
}

SProject::SProject(std::string sName, int nHours = 0){
    SProject::m_sName = sName;
    SProject::m_nHours = nHours;
}

SProject::~SProject(){
    //dtor
}

void SProject::DisplayProject(){
    std::cout &lt;&lt; std::endl &lt;&lt; std::endl &lt;&lt; &quot;Name:\t&quot; + SProject::m_sName &lt;&lt; std::endl &lt;&lt; &quot;Hours:\t&quot; &lt;&lt; SProject::m_nHours;
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

#include &quot;SProject.h&quot;

using namespace std;

int main(){

    string name;
    int hours;

    vector&lt;SProject&gt; Projects;

    for(int i = 0; i &lt; 3; i++){
        cout &lt;&lt; &quot;Name: &quot;;
        cin &gt;&gt; name;

        cout &lt;&lt; &quot;Stunden: &quot;;
        cin &gt;&gt; hours;

        SProject sproject(name, hours);
        Projects.push_back(sproject);
    }
    return 0;
}
</code></pre>
<p>Wäre eine <strong>ProjektManager</strong> Klasse sinnvoll? In der Methoden wie z.B. <strong>CreateProject</strong> oder <strong>DeleteProject</strong> drin sind?</p>
<p>Gruß<br />
Lukas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336798/x-instanzen-von-einem-objekt-speichern</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 20:35:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336798.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Feb 2016 15:25:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Wed, 17 Feb 2016 15:25:43 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein kleines Programm geschrieben, welches eine Eingabe (Projektname und Stunden) fordert. Nun erstelle ich immer eine Instanz von der Klasse <strong>SProject</strong> und packe dort die Werte rein - mithilfe des Konstruktors.</p>
<p>Die ganzen Instanzen speicher in einem Vector</p>
<pre><code>vector&lt;SProject&gt; Projects;
</code></pre>
<p>. Nun würde mich Interessieren ob der Code so wie ich in geschrieben habe auch vernünftig ist. Und wie sieht es aus mit</p>
<pre><code>delete
</code></pre>
<p>? Ich habe gelesen das ich ein</p>
<pre><code>delete
</code></pre>
<p>nur brauche wenn ich eine Instanz mit dem Schlüsselwort</p>
<pre><code>new
</code></pre>
<p>erstelle.</p>
<p><strong>SProject.h</strong></p>
<pre><code>#ifndef SPROJECT_H
#define SPROJECT_H

#include &lt;string&gt;

class SProject
{
    public:
        SProject();
        SProject(std::string sName, int nHours);
        virtual ~SProject();

        void DisplayProject();
    private:
        std::string m_sName;
        int m_nHours;
};

#endif // SPROJECT_H
</code></pre>
<p><strong>SProject.cpp</strong></p>
<pre><code>#include &lt;iostream&gt;

#include &quot;SProject.h&quot;

SProject::SProject(){
    //ctor
}

SProject::SProject(std::string sName, int nHours = 0){
    SProject::m_sName = sName;
    SProject::m_nHours = nHours;
}

SProject::~SProject(){
    //dtor
}

void SProject::DisplayProject(){
    std::cout &lt;&lt; std::endl &lt;&lt; std::endl &lt;&lt; &quot;Name:\t&quot; + SProject::m_sName &lt;&lt; std::endl &lt;&lt; &quot;Hours:\t&quot; &lt;&lt; SProject::m_nHours;
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

#include &quot;SProject.h&quot;

using namespace std;

int main(){

    string name;
    int hours;

    vector&lt;SProject&gt; Projects;

    for(int i = 0; i &lt; 3; i++){
        cout &lt;&lt; &quot;Name: &quot;;
        cin &gt;&gt; name;

        cout &lt;&lt; &quot;Stunden: &quot;;
        cin &gt;&gt; hours;

        SProject sproject(name, hours);
        Projects.push_back(sproject);
    }
    return 0;
}
</code></pre>
<p>Wäre eine <strong>ProjektManager</strong> Klasse sinnvoll? In der Methoden wie z.B. <strong>CreateProject</strong> oder <strong>DeleteProject</strong> drin sind?</p>
<p>Gruß<br />
Lukas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487568</guid><dc:creator><![CDATA[KreativerName]]></dc:creator><pubDate>Wed, 17 Feb 2016 15:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Wed, 17 Feb 2016 15:43:55 GMT]]></title><description><![CDATA[<p>KreativerName schrieb:</p>
<blockquote>
<p>Nun würde mich Interessieren ob der Code so wie ich in geschrieben habe auch vernünftig ist.</p>
</blockquote>
<p>Wozu definierst du einen Destruktor und warum auch nocht virtual?<br />
Wozu der leere Konstruktor?<br />
Warum benutzt du im Konstruktor keine Initialisierungsliste?<br />
Warum verwendest du SProject::m_sName statt m_sName</p>
<p>KreativerName schrieb:</p>
<blockquote>
<p>Und wie sieht es aus mit</p>
<pre><code>delete
</code></pre>
<p>? Ich habe gelesen das ich ein</p>
<pre><code>delete
</code></pre>
<p>nur brauche wenn ich eine Instanz mit dem Schlüsselwort</p>
<pre><code>new
</code></pre>
<p>erstelle.</p>
</blockquote>
<p>Dann weißt du ja schon alles. Was ist die Frage?</p>
<p>KreativerName schrieb:</p>
<blockquote>
<p>Wäre eine <strong>ProjektManager</strong> Klasse sinnvoll? In der Methoden wie z.B. <strong>CreateProject</strong> oder <strong>DeleteProject</strong> drin sind?</p>
</blockquote>
<p>Nur, wenn die Projekte dort verwaltet werden. Vorsicht: Klassen, die Manager heißen, tendieren dazu, zu viele Aufgaben zu übernehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487570</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 17 Feb 2016 15:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Thu, 18 Feb 2016 07:59:50 GMT]]></title><description><![CDATA[<p>Danke für die Antwort manni66.</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Wozu definierst du einen Destruktor</p>
</blockquote>
<p>Das kann ich dir nicht sagen. Ich dachte (denke immer noch), dass eine Klasse einen Destruktor besitzen muss.</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>und warum auch nocht virtual?</p>
</blockquote>
<p>virtual ist in dem Fall wirklich überflüssig.</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Wozu der leere Konstruktor?</p>
</blockquote>
<p>Ist es sinnvoller einen Konstruktor mit vorgegebenen Parameterwerten zu definieren?</p>
<p>z.B.</p>
<pre><code>SProject::SProject(std::string sName = &quot;ProjektName&quot;, int nHours = 0){
    SProject::m_sName = sName;
    SProject::m_nHours = nHours;
}
</code></pre>
<p>Und dafür den Standartkonstruktor zu entfernen?</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Warum benutzt du im Konstruktor keine Initialisierungsliste?</p>
</blockquote>
<p>Ich habe mir die Initialisierungslisten nochmal angeschaut und habe gelesen, dass sie die Schritte 1. Speicherbeschaffung und 2. die Zuweisung zusammenfasst und somit schneller als ein normaler Konstruktor ist.<br />
Wann benutzt man also Initialisierungslisten und wann normale Konstruktoren? Oder nehme ich immer<br />
Initialisierungslisten?</p>
<pre><code>SProject(std::string sName, int nHours)
    : m_sName(sName), m_nHours(nHours){
}
</code></pre>
<p>manni66 schrieb:</p>
<blockquote>
<p>Warum verwendest du SProject::m_sName statt m_sName</p>
</blockquote>
<p>Ich dachte das <strong>SProject::m_sName</strong> so etwas in der Art wie <strong>this</strong> (wie in z.B. C# in Klassen benutzt wird) ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487645</guid><dc:creator><![CDATA[KreativerName]]></dc:creator><pubDate>Thu, 18 Feb 2016 07:59:50 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Thu, 18 Feb 2016 08:35:51 GMT]]></title><description><![CDATA[<p>KreativerName schrieb:</p>
<blockquote>
<p>Danke für die Antwort manni66.</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Wozu definierst du einen Destruktor</p>
</blockquote>
<p>Das kann ich dir nicht sagen. Ich dachte (denke immer noch), dass eine Klasse einen Destruktor besitzen muss.</p>
</blockquote>
<p>Das ist auch nicht ganz falsch, man muss sich schon sehr anstrengen, um eine Klasse zu erzeugen, die keinen Destruktor braucht. Aber weil das so ist, wird ein Destruktor bei Bedarf automatisch erzeugt. Siehe:<br />
<a href="https://en.wikipedia.org/wiki/Special_member_functions" rel="nofollow">https://en.wikipedia.org/wiki/Special_member_functions</a><br />
Diese automatisch erzeugten Funktionen haben dann die gleiche Funktionalität, als wenn du diese Funktionen selber leer definiert hättest (was in aller Regel auch korrekt ist). Es hat aber allerlei Vorteile, wenn man diese Funktionen nicht unnötig selber definiert und damit ist nicht nur Schreibfaulheit gemeint. Der Compiler kann allerlei Optimierungen vornehmen, wenn er mit Sicherheit weiß, dass der automatisch erzeugte Destruktor benutzt wird und keine benutzerdefinierte Funktion (in der er mit allem möglichen rechnen müsste).</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Wozu der leere Konstruktor?</p>
</blockquote>
<p>Ist es sinnvoller einen Konstruktor mit vorgegebenen Parameterwerten zu definieren?</p>
</blockquote>
<p>Jain. Für den Konstruktor gilt das gleiche wie oben für den Destruktor gesagt. Wenn er sowieso leer ist, dann kannst und solltest du ihn dir auch sparen.<br />
Allgemein sollte ein Objekt aber nach der Erzeugung mittels des Konstruktors voll einsatzbereit sein. Das heißt, es sollte nicht nötig sein, noch weitere Init-Funktionen oder ähnliches aufzurufen, bevor man mit dem Objekt arbeiten kann. Das Beispiel hier ist zu abstrakt, als dass ich mit Sicherheit sagen könnte, ob hier ein komplexer, selbstdefinierter Konstruktor nötig wäre oder nicht. Deine Defaultparameter sehen aber jedenfalls eher unsinnig aus. Defaultparameter sind nicht als Platzhalter gedacht!</p>
<blockquote>
<p>Wann benutzt man also Initialisierungslisten und wann normale Konstruktoren? Oder nehme ich immer<br />
Initialisierungslisten?</p>
</blockquote>
<p>Normalerweise immer Initialisierungslisten. Jemand mit mehr Zeit als ich mag vielleicht ein exotisches Beispiel ersinnen, bei dem diese Faustregel verletzt wird.</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Warum verwendest du SProject::m_sName statt m_sName</p>
</blockquote>
<p>Ich dachte das <strong>SProject::m_sName</strong> so etwas in der Art wie <strong>this</strong> (wie in z.B. C# in Klassen benutzt wird) ist.</p>
</blockquote>
<p>Es ist einfach überflüssig. Innerhalb von Methodendefinitionen der Klasse ist das alles weitgehend identisch, egal ob mit Klassennamen, this, oder einfach gar nichts vor dem Bezeichner. Da kann man auch einfach die kürzeste Schreibweise wählen, außer man hat gewichtige Gründe, dies nicht zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487649</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 18 Feb 2016 08:35:51 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Thu, 18 Feb 2016 09:15:29 GMT]]></title><description><![CDATA[<p>Danke für die Antwort SeppJ!</p>
<p>Nochmal eine Frage zu meinem ersten Post. Ich speicher momentan die Instanzen von der Klasse <strong>SProject</strong> in einem <strong>Vector</strong>. Macht man das auch so? Oder benutzt man eher eine <strong>list</strong>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487654</guid><dc:creator><![CDATA[KreativerName]]></dc:creator><pubDate>Thu, 18 Feb 2016 09:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Thu, 18 Feb 2016 10:02:29 GMT]]></title><description><![CDATA[<p>KreativerName schrieb:</p>
<blockquote>
<p>Macht man das auch so?</p>
</blockquote>
<p>Man macht, was man benötigt. <strong>Wenn</strong> man einem Container benötigt, nimmt man std::vector, es sei denn, ein anderer passt besser. Dabei sollte man &quot;ist schneller&quot; als Argument genau prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487656</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 18 Feb 2016 10:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Thu, 18 Feb 2016 10:20:13 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>KreativerName schrieb:</p>
<blockquote>
<p>Macht man das auch so?</p>
</blockquote>
<p>Man macht, was man benötigt. <strong>Wenn</strong> man einem Container benötigt, nimmt man std::vector, es sei denn, ein anderer passt besser. Dabei sollte man &quot;ist schneller&quot; als Argument genau prüfen.</p>
</blockquote>
<p>Ok.</p>
<p>Danke an euch beiden für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487657</guid><dc:creator><![CDATA[KreativerName]]></dc:creator><pubDate>Thu, 18 Feb 2016 10:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to X Instanzen von einem Objekt speichern on Thu, 18 Feb 2016 18:15:39 GMT]]></title><description><![CDATA[<p>Hinweis: Eine list passt so gut wie nie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2487709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2487709</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 18 Feb 2016 18:15:39 GMT</pubDate></item></channel></rss>