<?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[Wie?: Klassenvariable, die für jedes Objekt global ist.]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe da ein kleines Programm: Gegeben ist eine Basisklasse Medium.<br />
Von Medium werden zwei Klassen, Video und Buch abgeleitet.<br />
Die Klassen (Video und Buch) werden dann zur Programmlaufzeit instanziert und in einem Array gespeichert.<br />
Nun möchte ich folgendes machen: Die Klassen Video und Buch sollen eine Klassenvariable &quot;Bestand&quot; beinhalten, die, wie der Name ja sagt, den aktuellen Bestand an Videos und Büchern speichert. &quot;Bestand&quot; wird also genau dann inkrementiert, wenn ein Objekt von der jeweiligen Klasse angelegt wird.<br />
Der Punkt ist: Wird die Variable &quot;Bestand&quot; inkrementiert, so soll sie in allen Objekten &quot;Buch&quot; oder &quot;Video&quot; gleichzeitig aktualisiert werden, ohne dass ich explizit jedes Objekt aufrufen und dort die Variable verändern muss.</p>
<p>Geht das und wenn ja, wie?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240077/wie-klassenvariable-die-für-jedes-objekt-global-ist</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 01:12:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240077.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 May 2009 15:08:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Fri, 01 May 2009 15:08:15 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe da ein kleines Programm: Gegeben ist eine Basisklasse Medium.<br />
Von Medium werden zwei Klassen, Video und Buch abgeleitet.<br />
Die Klassen (Video und Buch) werden dann zur Programmlaufzeit instanziert und in einem Array gespeichert.<br />
Nun möchte ich folgendes machen: Die Klassen Video und Buch sollen eine Klassenvariable &quot;Bestand&quot; beinhalten, die, wie der Name ja sagt, den aktuellen Bestand an Videos und Büchern speichert. &quot;Bestand&quot; wird also genau dann inkrementiert, wenn ein Objekt von der jeweiligen Klasse angelegt wird.<br />
Der Punkt ist: Wird die Variable &quot;Bestand&quot; inkrementiert, so soll sie in allen Objekten &quot;Buch&quot; oder &quot;Video&quot; gleichzeitig aktualisiert werden, ohne dass ich explizit jedes Objekt aufrufen und dort die Variable verändern muss.</p>
<p>Geht das und wenn ja, wie?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704129</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Fri, 01 May 2009 15:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Fri, 01 May 2009 15:11:22 GMT]]></title><description><![CDATA[<p>Ja das geht, schau dir mal das Schlüsselwort static an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704130</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Fri, 01 May 2009 15:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Fri, 01 May 2009 15:11:30 GMT]]></title><description><![CDATA[<p>Was du suchst, sind <code>static</code> -Variablen.</p>
<pre><code class="language-cpp">class Video
{
    public:
        ...
    private:
        static unsigned int AnzahlVideos;
};

// Definition in .cpp-Datei
unsigned int Video::AnzahlVideos = 0;
</code></pre>
<p>Die kannst du dann von der Klasse aus wie normale Membervariablen benutzen. In jedem Konstruktor inkrementierst du sie, und im Destruktor dekrementierst du sie. Du musst aber beachten, dass <code>AnzahlVideos</code> die gesamte Anzahl existierender Instanzen angibt, also auch eventuelle temporäre Objekte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704131</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 01 May 2009 15:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Fri, 01 May 2009 15:19:41 GMT]]></title><description><![CDATA[<p>Danke sehr. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704136</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Fri, 01 May 2009 15:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Fri, 01 May 2009 20:56:04 GMT]]></title><description><![CDATA[<p>Hallo nochmal!</p>
<p>Ich versuche gerade mein Array voller Medienelemente dynamisch zu gestalten, komme aber nicht voran. Weiß einer, wies richtig geht?</p>
<pre><code class="language-cpp">void create(Medium* medium){
	if(medium==NULL){
		medium = new Medium[1];
		medium-&gt;incBestand();
	}
	else{
		Medium *p = new Medium[medium-&gt;getBestand()+1];
		for(int i=0;i&lt;medium-&gt;getBestand();i++)
			p[i] = medium[i];
		delete [] medium;
		medium = p;
		medium[medium-&gt;getBestand()] = new Medium;
		medium-&gt;incBestand();
	}
}
</code></pre>
<p>Error 1 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'Medium *' (or there is no acceptable conversion)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704263</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Fri, 01 May 2009 20:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Fri, 01 May 2009 21:02:35 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Hallo nochmal!</p>
<p>Ich versuche gerade mein Array voller Medienelemente dynamisch zu gestalten, komme aber nicht voran. Weiß einer, wies richtig geht?</p>
<pre><code class="language-cpp">void create(Medium* medium){
	if(medium==NULL){
		medium = new Medium[1];
		medium-&gt;incBestand();
	}
	else{
		Medium *p = new Medium[medium-&gt;getBestand()+1];
		for(int i=0;i&lt;medium-&gt;getBestand();i++)
			p[i] = medium[i];
		delete [] medium;
		medium = p;
		medium[medium-&gt;getBestand()] = new Medium;
		medium-&gt;incBestand();
	}
}
</code></pre>
<p>Error 1 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'Medium *' (or there is no acceptable conversion)</p>
</blockquote>
<p>ja, du meinst</p>
<pre><code class="language-cpp">private:
Medium(Medium const&amp;);//zur sicherheit verbieten
Medium operator=(Medium const&amp;);//zur sicherheit verbieten
public:
Medium(){
  ++bestand;
}
~Medium(){
  --bestand;
}
</code></pre>
<p>mehr ist da nicht.</p>
<p>das dynamische array ist dann ne ganz andere sache. und sollte nur zeiger auf medien halten.</p>
<p>vielleicht</p>
<pre><code class="language-cpp">vector&lt;Medium*&gt; medien;
</code></pre>
<p>geht aber auch mit nem eigenen dynamischen array. aber mach das array erstmal als ganz eigenes projekt und verwalte double-werte. steig erst am ende nach Medium* um.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704266</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 01 May 2009 21:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 11:57:17 GMT]]></title><description><![CDATA[<p>Ich habs zwar auch ohne vector hinbekommen, nur das Blöde ist, dass beim Anlegen des Zwischenspeichers new den Konstoruktor der Klasse aufruft. - Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704396</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Sat, 02 May 2009 11:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 12:43:34 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Ich habs zwar auch ohne vector hinbekommen, nur das Blöde ist, dass beim Anlegen des Zwischenspeichers new den Konstoruktor der Klasse aufruft. - Ideen?</p>
</blockquote>
<p><code>operator new[sizeof(asd)*length]</code><br />
und dann mit placement new den ctor aufrufen#</p>
<p>btw:</p>
<pre><code class="language-cpp">void create(Medium* medium){
    if(medium==NULL){
        medium = new Medium[1];
/*...*/
    }
}
</code></pre>
<p>das funzt? Oo</p>
<p>Ich glaube eher nicht... ^^<br />
der Pointer wird nämlich kopiert -&gt; du veränderst nur die kopie...<br />
richtig wäre eine referenz auf einen zeiger - dann kannst du dem auch (wirkungsvoll) was zuweisen...<br />
btw: new Medium**[1]** ist doch hässlich... vor kurzem war hier scho ma jmd, der ständig ne 1 als dimension gewählt hat - ist das jetzt in, sowas zu machen? <code>new Medium</code> sieht wohl zu übersichtlich aus? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>bb</p>
<p>PS: (offtopic)<br />
wieso kann man noch immer nicht fett courir schreiben? -.- also so: [c]<strong>bla</strong>[/c]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704423</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 02 May 2009 12:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 13:04:47 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p><code>operator new[sizeof(asd)*length]</code></p>
</blockquote>
<p>Du meinst wohl</p>
<pre><code class="language-cpp">operator new[] (sizeof(asd) * length);
</code></pre>
<p>Das gibt allerdings nur einen <code>void*</code> zurück und muss noch in den Zieltypen gecastet werden. Statt Placement New kann man auch die C++-Funktionen <code>std::unitialized_copy()</code> , <code>std::unitialized_fill()</code> oder <code>std::unitialized_fill_n()</code> verwenden.</p>
<p>Allerdings kann man die []-Klammern eigentlich auch weglassen (und gleich <code>operator new</code> einsetzen), wenn man Allokation und Konstruktion trennt. Bei der Freigabe sollte man vorsichtig sein, da man zuerst für jedes Element den Destruktor aufrufen muss. Ich hatte das selber schon benötigt und eine entsprechende Funktion geschrieben:</p>
<pre><code class="language-cpp">// Ruft für alle Elemente in der Zeiger-Range [first, last[ den Destruktor auf.
template &lt;typename T&gt;
void destroy_range(T* first, T* last)
{
	for (; first != last; ++first)
	{
		first-&gt;~T();
	}
}
</code></pre>
<p>Wieso gibt es diese Funktion eigentlich in der Standardbibliothek nicht? Die Gegenstücke bei der Konstruktion sind ja auch vorhanden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704431</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 02 May 2009 13:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 13:18:32 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p><code>operator new[sizeof(asd)*length]</code></p>
</blockquote>
<p>Du meinst wohl</p>
<pre><code class="language-cpp">operator new[] (sizeof(asd) * length);
</code></pre>
</blockquote>
<p>japp - in letzter zeit hab ichs iwie nich so mit dem nachdenken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f623.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--persevering_face"
      title="&gt;.&lt;"
      alt="😣"
    /></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das gibt allerdings nur einen <code>void*</code> zurück und muss noch in den Zieltypen gecastet werden.</p>
</blockquote>
<p>Jopp - wo ist das Problem?</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Statt Placement New kann man auch die C++-Funktionen <code>std::unitialized_copy()</code> , <code>std::unitialized_fill()</code> oder <code>std::unitialized_fill_n()</code> verwenden.</p>
</blockquote>
<p>hatte ich ja noch nie gehört - ich seh jz auch nicht wirklich nen vorteil darin - überseh ich was? ^^</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Ruft für alle Elemente in der Zeiger-Range [first, last[ den Destruktor auf.
template &lt;typename T&gt;
void destroy_range(T* first, T* last)
{
	for (; first != last; ++first)
	{
		first-&gt;~T();
	}
}
</code></pre>
<p>Wieso gibt es diese Funktion eigentlich in der Standardbibliothek nicht?</p>
</blockquote>
<p>Gute Frage - ich habs bis jz aber auch immer selbst geschrieben ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704437</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 02 May 2009 13:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 13:35:08 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Jopp - wo ist das Problem?</p>
</blockquote>
<p>Wo sagte ich etwas von Problem? Ich wollte es nur erwähnen, da das vielleicht hilfreich sein könnte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Nexus schrieb:</p>
<blockquote>
<p>hatte ich ja noch nie gehört - ich seh jz auch nicht wirklich nen vorteil darin - überseh ich was? ^^</p>
</blockquote>
<p>Keinen Vorteil? Na gut, wenn du dir immer alles selbst schreiben willst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Nehmen wir an, du hast einen <code>vector</code> -ähnlichen Container.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class dynamic_array
{
    public: // separater Ctor statt Defaultparameter wäre besser, hier aber irrelevant...
        dynamic_array(size_t num_elements, const T&amp; value = T());
        dynamic_array(const dynamic_array&amp; origin);
    private:
        size_t m_size;   // mal ohne capacity
        T*     m_array;
};

// Konstruktor mit Grösse und Default-Element als Parameter 
template &lt;typename T&gt;
dynamic_array&lt;T&gt;::dynamic_array(size_t num_elements, const T&amp; value)
: m_size(num_elements)
, m_array(static_cast&lt;T*&gt;(operator new(sizeof(T) * m_size)))
{
    std::uninitialized_fill_n(m_array, m_size, value);
}

// Kopierkonstruktor
template &lt;typename T&gt;
dynamic_array&lt;T&gt;::dynamic_array(const dynamic_array&lt;T&gt;&amp; origin)
: m_size(origin.m_size)
, m_array(static_cast&lt;T*&gt;(operator new(sizeof(T) * m_size)))
{
    std::uninitialized_copy(origin.m_array, origin.m_array + m_size, m_array);
}
</code></pre>
<p>Nur so als Beispiel. Man könnte die Funktionalität natürlich noch mehr kapseln, mindestens als freie Funktionen oder sogar als Allokatoren. Aber grundsätzlich sind die <code>std::uninitialized_...</code> -Funktionen relativ nützlich. Nur reichen sie nicht ganz aus. Ich habe bei mir einen Header, bei dem mehr oder weniger sinnvolle Raw-Memory-Funktionen vorhanden sind (darunter oben genanntes <code>destroy_range()</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704450</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 02 May 2009 13:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 23:50:34 GMT]]></title><description><![CDATA[<p>Also irgendwas mach ich eindeutig falsch.</p>
<pre><code class="language-cpp">class Medium{
	protected:
		...
	public:
		...

		void* operator new[] (std::size_t size);
};
</code></pre>
<p>Aufruf:</p>
<pre><code class="language-cpp">Medium* create(Medium* medium){ // medium stets != NULL

	void *p = new Medium[medium-&gt;getBestand()+1]; 

}
</code></pre>
<p>Und das quitiert mir VS08 mit:</p>
<p>Error 1 error LNK2019: unresolved external symbol &quot;public: static void * __cdecl Medium::operator new[](unsigned int)&quot; (??_UMedium@@SAPAXI@Z) referenced in function &quot;class Medium * __cdecl create(class Medium *)&quot; (?create@@YAPAVMedium@@PAV1@@Z) functions.obj</p>
<p>Error 2 fatal error LNK1120: 1 unresolved externals C:\Dokumente und Einstellungen\IM\Eigene Dateien\Visual Studio 2008\Projects\Medienbib2\Debug\Medienbib2.exe 1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704639</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Sat, 02 May 2009 23:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sat, 02 May 2009 23:58:26 GMT]]></title><description><![CDATA[<p>Wenn du den <code>operator new[]</code> deklarierst, musst du auch dafür sorgen, eine eigene Implementierung (Funktionsdefinition) zur Verfügung zu stellen. Meistens besteht aber kein Grund, die Speicheranforderungs-Operatoren zu überladen. Also versuch mal, die Deklaration wegzulassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704640</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 02 May 2009 23:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:16:26 GMT]]></title><description><![CDATA[<p>Ups.</p>
<pre><code class="language-cpp">void* operator new[](std::size_t size){
			return (void*) (size*sizeof(Medium));
		}
</code></pre>
<p>Was er mir nun liefer ist eine excess violation.</p>
<p>Bzw., eigentlich ist es wirklich unnötig und die Aufgabenstellung schreit ja gerade zu nach einer verketteten Liste aber ich hätts tortzdem gern hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704642</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Sun, 03 May 2009 00:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:20:21 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p><strong>excess</strong> violation.</p>
</blockquote>
<p>Hehe... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">void* operator new[](std::size_t size){
			return (void*) (size*sizeof(Medium));
		}
</code></pre>
<p>Weisst du, was du hier machst? Du multiplizierst <code>size</code> mit <code>sizeof(Medium)</code> . Weil du einen überaus gefährlichen und bösen C-Cast anwendest, merkst du nicht, was du castest. Nämlich einen Integer zu einem Zeiger. Dein <code>operator new[]</code> tut also so, als wäre das Ergebnis der Multiplikation eine Adresse. Und als wäre an dieser Adresse ein schöner, neu angelegter Speicherbereich für dich.</p>
<p>Ich denke, der Rest ist klar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704644</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 03 May 2009 00:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:23:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Weil du einen überaus gefährlichen und bösen C-Cast anwendest, merkst du nicht, was du castest. Nämlich einen Integer zu einem Zeiger.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704645</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 03 May 2009 00:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:33:42 GMT]]></title><description><![CDATA[<p>Na wenn ich schon dabei bin, C-Funktionen zu benutzen, kann ich den Speicher wohl auch gleich mit malloc allokieren...<br />
Oder bietet mir C++ bessere Alternativen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704646</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Sun, 03 May 2009 00:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:49:07 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Na wenn ich schon dabei bin, C-Funktionen zu benutzen, kann ich den Speicher wohl auch gleich mit malloc allokieren...<br />
Oder bietet mir C++ bessere Alternativen?</p>
</blockquote>
<p>ja.<br />
statt</p>
<pre><code class="language-cpp">Bla* p=malloc(15*sizeof(Bla));
</code></pre>
<p>sollte man</p>
<pre><code class="language-cpp">Bla* p=new Bla[15];
</code></pre>
<p>schreiben.<br />
die version mit new ruft zusätzlich den konstruktor von Bla für jedes array-element auf. also nix wenn es simple typen sind, und dann ist new auch genausoschnell. aber wenn der konstruktor von Bla code ausführen muß, macht new[] das austomatisch.<br />
deswegen sollte man in c++ grundsätzlich new benutzen, damit man nicht nachdenken muß, ob der typ gerade einer war, der keinen konstruktor hat oder einer, der soch mal einen hat.</p>
<p>zum anlegen rohen speichers gibt es operator new(size_t) versus malloc(size_t), die genau gleich sind. naja, fast. operator new ist gerne mal auf kleine objekte optimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704647</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 03 May 2009 00:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:45:46 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Na wenn ich schon dabei bin, C-Funktionen zu benutzen, kann ich den Speicher wohl auch gleich mit malloc allokieren...<br />
Oder bietet mir C++ bessere Alternativen?</p>
</blockquote>
<p>Wieso willst du unbedingt <code>operator new[]</code> selber implementieren? Du kannst doch den vorgefertigten nutzen. Es ist unwahrscheinlich, dass du für den Alltag etwas anderes brauchst. Also entferne endlich dessen Deklaration in deiner Klasse.</p>
<p>Und ja, C++ bietet bessere Möglichkeiten. Sieh dir bei Gelegenheit mal <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow">STL-Container</a> an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704648</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 03 May 2009 00:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 00:49:22 GMT]]></title><description><![CDATA[<p>Ja, aber den Aufruf des Konstruktors wollte ich doch unbedingt vermeiden, weil ich vorhatte, mein Array von Medien-Objekten dynamisch zu verwalten. Und dazu musste ich dann neuen Speicher anlegen und es wäre wirklich nicht so toll, wenn dabei stets der Konstruktor aufpoppt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704649</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Sun, 03 May 2009 00:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 02:43:05 GMT]]></title><description><![CDATA[<p>Nun ja, ist auch egal. Ich komme im Moment damit, new zu überladen, sowieso auf keinen grünen Zweig mehr.</p>
<p>Mal was anderes:</p>
<pre><code class="language-cpp">class Medium{
	private:
		static int bestand;

	public:

		 void incBestand();
		 int getBestand();

};

class Book : public Medium{
	private:
		static int bestand;
	public:

};

class Video : public Medium{
	private:
		static int bestand;
	public:

};
</code></pre>
<p>Wie kommt es, dass void incBestand() und int getBestand() in den Klassen Book und Video immerzu auf die static-Variable &quot;bestand&quot; aus der Klasse Medium zugreiffen, obwohl die Variable private ist, damit nicht vererbt und sowieso redefiniert wird? Und vor allem: Warum geht es überhaupt? Dachte, auf statische Klassenvariablen könne man nur mit statischen Methoden zugreiffen.<br />
Definiere ich die Methoden in jeder Klasse jeweils als static, funktioniert alles, wie es soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704651</guid><dc:creator><![CDATA[eine Frage bitte]]></dc:creator><pubDate>Sun, 03 May 2009 02:43:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 04:21:56 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>Ich habe da ein kleines Programm: Gegeben ist eine Basisklasse Medium.<br />
Von Medium werden zwei Klassen, Video und Buch abgeleitet.<br />
Die Klassen (Video und Buch) werden dann zur Programmlaufzeit instanziert und in einem Array gespeichert.<br />
Nun möchte ich folgendes machen: Die Klassen Video und Buch sollen eine Klassenvariable &quot;Bestand&quot; beinhalten, die, wie der Name ja sagt, den aktuellen Bestand an Videos und Büchern speichert. &quot;Bestand&quot; wird also genau dann inkrementiert, wenn ein Objekt von der jeweiligen Klasse angelegt wird.<br />
Der Punkt ist: Wird die Variable &quot;Bestand&quot; inkrementiert, so soll sie in allen Objekten &quot;Buch&quot; oder &quot;Video&quot; gleichzeitig aktualisiert werden, ohne dass ich explizit jedes Objekt aufrufen und dort die Variable verändern muss.</p>
<p>Geht das und wenn ja, wie?</p>
<p>Gruß</p>
</blockquote>
<p>Bestand ist keine Eigenschaft der Bücher oder Videos, sondern des Dings (Laden/Bücherei) in dem sie sind. Vergiss das mit dem new überladen, mach dir eine Klasse die die Medien hält und beim hinzufügen oder entfernen den Bestand aktualisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704655</guid><dc:creator><![CDATA[Richtige Lösung]]></dc:creator><pubDate>Sun, 03 May 2009 04:21:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 04:24:51 GMT]]></title><description><![CDATA[<p>Ach, und wenn du dir sicher bist, dass es immer nur genau eine Bücherei gibt, dann kannst du die als <a href="https://www.google.de/search?&amp;q=Singleton%20" rel="nofollow">Google: Singleton</a> machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704656</guid><dc:creator><![CDATA[Richtige Lösung]]></dc:creator><pubDate>Sun, 03 May 2009 04:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 04:25:04 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Wie kommt es, dass void incBestand() und int getBestand() in den Klassen Book und Video immerzu auf die static-Variable &quot;bestand&quot; aus der Klasse Medium zugreiffen, obwohl die Variable private ist, damit nicht vererbt und sowieso redefiniert wird?</p>
</blockquote>
<p>private Member werden vererbt, die erbende Klasse hat nur keinen direkten Zugriff darauf, aber vererbte Funktionen dürfen trotzdem normal darauf zugreifen, wäre das nicht so würden ja einzellne Funktionen uU nichtmehr funktionieren. Deine 2 Funktionen greifen auf die Variable zu die zu ihrer Klasse gehört, da sie zu Medium gehören greifen sie auch auf die Variable aus Medium zu.</p>
<p>Ich weiß hier leider nicht genau ob man die static wirklich überall einzelln haben muß oder ob eine statische Bestand Variable in Medium nicht reichen würde, weil ich nicht weiß ob sie danach 3x oder trotdzem nur 1x existieren würde.</p>
<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Und vor allem: Warum geht es überhaupt? Dachte, auf statische Klassenvariablen könne man nur mit statischen Methoden zugreiffen.</p>
</blockquote>
<p>Du denkst da leider falsch. Nicht statische Funktionen dürfen auf statische Member und Funktionen zugreifen, nur umgedreht geht es nicht.</p>
<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Definiere ich die Methoden in jeder Klasse jeweils als static, funktioniert alles, wie es soll.</p>
</blockquote>
<p>Siehe erster Quote.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704657</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 03 May 2009 04:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie?: Klassenvariable, die für jedes Objekt global ist. on Sun, 03 May 2009 08:20:05 GMT]]></title><description><![CDATA[<p>eine Frage bitte schrieb:</p>
<blockquote>
<p>Ja, aber den Aufruf des Konstruktors wollte ich doch unbedingt vermeiden, weil ich vorhatte, mein Array von Medien-Objekten dynamisch zu verwalten. Und dazu musste ich dann neuen Speicher anlegen und es wäre wirklich nicht so toll, wenn dabei stets der Konstruktor aufpoppt.</p>
</blockquote>
<p>Den Aufruf des Konstruktors vermeidest du indem du einfach <code>operator new[]</code> selber aufrufst. Schnellerklärung zum Thema: C++ unterscheidet zwischen der Funktion <code>operator new[]</code> und dem Operator <code>new</code> . Das, was wir normalerweise im Quellcode schreiben, ist der Operator <code>new</code> . Der Compiler macht daraus einen Aufruf des <code>operator new[]</code> , gefolgt von entsprechend vielen Konstruktoraufrufen für die ganzen Elemente des Arrays. Ähnliches gilt für den Operator <code>delete</code> : Hier wird erst der Destruktor aufgerufen, danach dann <code>operator delete</code> , der nurnoch den Speicher freigibt.<br />
Dein Versuch, <code>operator new[]</code> zu überladen wäre also wirkungslos, die konstruktoren würden immernoch aufgerufen wenn du den Aufruf nicht änderst.</p>
<p>Unskilled hatte eigentlich schon den richtigen Hinweis geliefert:</p>
<pre><code class="language-cpp">X* blankerSpeicher = operator new[](n*sizeof(X)); //Speicher für n Xe
for (int i = 0; i &lt; n; ++i)
  new (blankerSpeicher + i) X(); //placement new

//freigeben:
//delete[] blankerSpeicher;   //ruft alle Destruktoren auf und dann operator delete[]

for (int i = n-1; i &gt;= 0; --i)
  blankerSpeicher[i].~X();  //manueller Dtoraufruf
operator delete[] (blankerSpeicher);
</code></pre>
<p>Der Fehler bei deinem überladenen <code>operator new</code> war übrigens, dass du ihn nicht static deklariert hast. Wenn man sichs genau überlegt kann er garnicht anders als static sein, schließlich gibts kein Objekt, das ihn aufruft um Speicher für ein anderes Objekt zu beschaffen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704675</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 03 May 2009 08:20:05 GMT</pubDate></item></channel></rss>