<?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[Dynamisches Referenzen-Array]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe bisher in C/C++ immer mit Pointern gearbeitet.<br />
Nun wollte ich der Vorteile von Referenzen wegen (und auch wegen der Herausforderung des Unbekannten bzw. weniger Bekannten <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="😉"
    /> ) in meinem aktuellen Projekt soweit es geht auf Pointer verzichten und ausschliesslich Referenzen arbeiten.</p>
<p>Dies wollte ich auch gleich mit der ersten Klasse, der Template-Klasse &quot;DynamicArray&quot; (ich arbeite ausserdem auch das erste mal mit Templates), welche wie der Name schon sagt als eine Klasse zur Verwaltung eines dynamischen Arrays beliebigen Inhalts (vorwiegend von der Klasse string =&gt; DynamicStringArray) gedacht ist.<br />
Intern soll optimalerweise ein dynamischen Array aus Referenzen verwaltet werden (derzeit ists allerdings ein Pointer-Array, siehe unten).</p>
<pre><code class="language-cpp">//C++ Klasse DynamicArray
#pragma once

template &lt;class T&gt;
class DynamicArray
{
private:
	T** data;
	int count;
	int capacity;

	//template &lt;class T&gt;
	void move(int from,int pos)
	{
		//
	}

public:
	//template &lt;class T&gt;
	DynamicArray(void)
	{
		data = NULL;
		count = 0;
		capacity = 0;
	}

	//template &lt;class T&gt;
	void setCapacity(int cap)
	{
		cap=count;
		data = (T**)realloc(data,sizeof(T)*cap);
	}

	//template &lt;class T&gt;
	int add(T const&amp; _data)
	{
		count++;
		setCapacity(count);

		data[count-1]=_data;
	}

	//template &lt;class T&gt;
	int remove(int index)
	{
          //
	}

	//template &lt;class T&gt;
	void insert(int index,T const&amp; _data)
	{
		//
	}

	//template &lt;class T&gt;
	int getCount()
	{
		return count;
	}

	//template &lt;class T&gt;
	T&amp; operator[](int index)
	{
		return data[index];
	}

	//template &lt;class T&gt;
	~DynamicArray(void)
	{
	}
};
</code></pre>
<pre><code class="language-cpp">//Aufruf z.b. mit string/Cstring

	DynamicArray&lt;string&gt; arr;

	string a;

	arr.add(a);
</code></pre>
<p>Leider erhalte ich folgende Fehlermeldung und kann zwar das Problem erkennen, finde aber leider keine Lösung (weder bei Google noch hier):</p>
<pre><code class="language-cpp">1&gt;d:\dev\weirdhospital_neu_ogre\app\weirdhospital2\weirdhospital\dynamicarray.h(50) : error C2440: '=' : cannot convert from 'const std::string' to 'std::string *'
</code></pre>
<p>Wenn ich nun von der Fehlermeldung ausgehe liegt das Problem darin das ich beim hinzufügen von Elementen eine Referenz in ein dynamisches Pointer-Array speichere was logischerweise auch nicht gehen dürfte.</p>
<p>Wie stelle ich also nun an das ich entweder aus einer Referenz einen vollwertigen Pointer (inkl. in umgekehrte Richtung d.h. Pointer in Referenz für Rückgabe) mache oder aus dem Pointer-Array in der Klasse ein Refenzen-Array mache ?</p>
<p>Für eure Hilfe wäre ich euch sehr dankbar, da ich bei den Referenzen + Co. noch nicht so geübt bin und da darüber leider nicht so viel zu finden ist wie über Pointer !</p>
<p>Vielen Dank im voraus !</p>
<p>Mit freundlichen Grüßen,<br />
Thomas Tschofenig</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184757/dynamisches-referenzen-array</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:37:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184757.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Jun 2007 20:28:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Mon, 18 Jun 2007 20:28:45 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe bisher in C/C++ immer mit Pointern gearbeitet.<br />
Nun wollte ich der Vorteile von Referenzen wegen (und auch wegen der Herausforderung des Unbekannten bzw. weniger Bekannten <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="😉"
    /> ) in meinem aktuellen Projekt soweit es geht auf Pointer verzichten und ausschliesslich Referenzen arbeiten.</p>
<p>Dies wollte ich auch gleich mit der ersten Klasse, der Template-Klasse &quot;DynamicArray&quot; (ich arbeite ausserdem auch das erste mal mit Templates), welche wie der Name schon sagt als eine Klasse zur Verwaltung eines dynamischen Arrays beliebigen Inhalts (vorwiegend von der Klasse string =&gt; DynamicStringArray) gedacht ist.<br />
Intern soll optimalerweise ein dynamischen Array aus Referenzen verwaltet werden (derzeit ists allerdings ein Pointer-Array, siehe unten).</p>
<pre><code class="language-cpp">//C++ Klasse DynamicArray
#pragma once

template &lt;class T&gt;
class DynamicArray
{
private:
	T** data;
	int count;
	int capacity;

	//template &lt;class T&gt;
	void move(int from,int pos)
	{
		//
	}

public:
	//template &lt;class T&gt;
	DynamicArray(void)
	{
		data = NULL;
		count = 0;
		capacity = 0;
	}

	//template &lt;class T&gt;
	void setCapacity(int cap)
	{
		cap=count;
		data = (T**)realloc(data,sizeof(T)*cap);
	}

	//template &lt;class T&gt;
	int add(T const&amp; _data)
	{
		count++;
		setCapacity(count);

		data[count-1]=_data;
	}

	//template &lt;class T&gt;
	int remove(int index)
	{
          //
	}

	//template &lt;class T&gt;
	void insert(int index,T const&amp; _data)
	{
		//
	}

	//template &lt;class T&gt;
	int getCount()
	{
		return count;
	}

	//template &lt;class T&gt;
	T&amp; operator[](int index)
	{
		return data[index];
	}

	//template &lt;class T&gt;
	~DynamicArray(void)
	{
	}
};
</code></pre>
<pre><code class="language-cpp">//Aufruf z.b. mit string/Cstring

	DynamicArray&lt;string&gt; arr;

	string a;

	arr.add(a);
</code></pre>
<p>Leider erhalte ich folgende Fehlermeldung und kann zwar das Problem erkennen, finde aber leider keine Lösung (weder bei Google noch hier):</p>
<pre><code class="language-cpp">1&gt;d:\dev\weirdhospital_neu_ogre\app\weirdhospital2\weirdhospital\dynamicarray.h(50) : error C2440: '=' : cannot convert from 'const std::string' to 'std::string *'
</code></pre>
<p>Wenn ich nun von der Fehlermeldung ausgehe liegt das Problem darin das ich beim hinzufügen von Elementen eine Referenz in ein dynamisches Pointer-Array speichere was logischerweise auch nicht gehen dürfte.</p>
<p>Wie stelle ich also nun an das ich entweder aus einer Referenz einen vollwertigen Pointer (inkl. in umgekehrte Richtung d.h. Pointer in Referenz für Rückgabe) mache oder aus dem Pointer-Array in der Klasse ein Refenzen-Array mache ?</p>
<p>Für eure Hilfe wäre ich euch sehr dankbar, da ich bei den Referenzen + Co. noch nicht so geübt bin und da darüber leider nicht so viel zu finden ist wie über Pointer !</p>
<p>Vielen Dank im voraus !</p>
<p>Mit freundlichen Grüßen,<br />
Thomas Tschofenig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308693</guid><dc:creator><![CDATA[thomas233]]></dc:creator><pubDate>Mon, 18 Jun 2007 20:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Mon, 18 Jun 2007 20:33:55 GMT]]></title><description><![CDATA[<p>sieht doch alles ganz gut aus.Bis auf das du ein T** m_Data hast. Mach da mal ein T* m_Data draus. Dann müsste es klappen.</p>
<p>Außerdem: Ich finds nich gut, bei jedem add speicher zu holen, der std::vector macht es zB so, dass er immer einen festen betrag speicher holt und nicht nur speicher für ein element.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308695</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 18 Jun 2007 20:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Mon, 18 Jun 2007 20:35:03 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">data[count-1]=_data;
</code></pre>
<p>Ich denke hier steckt der Fehler.<br />
(Ich hab den code jetzt nur überflogen)</p>
<p>Du weist einen const string ( den du per Referenz übergibts )<br />
einem Array zu der Pointer auf strings erwartet!</p>
<p>Du musst also entweder deine Definition von data ändern<br />
(sodass er direkt strings speichert) oder aber selbst<br />
speicher für einen neuen string anfordern, _data dorhineinkopieren<br />
und dem Array data die adresse des neuen strings übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308699</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Mon, 18 Jun 2007 20:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Mon, 18 Jun 2007 21:04:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2470">@Maxi</a>:</p>
<p>Hmm....also wenn ich es so abändere</p>
<pre><code class="language-cpp">T* data;

    //template &lt;class T&gt;
    void setCapacity(int cap)
    {
        cap=count;
        data = (T*)realloc(data,sizeof(T)*cap);
    }
</code></pre>
<p>klappts mit dem Kompilieren zwar aber dafür wird dann bei der Speicherallokierung ein ungültiger Pointer allokiert.</p>
<p>@Storm.Xapek.de:<br />
Entspricht das eigentlich nicht dem obrigen ?</p>
<p>Danke erstmal !</p>
<p>Mfg.<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308714</guid><dc:creator><![CDATA[thomas233]]></dc:creator><pubDate>Mon, 18 Jun 2007 21:04:40 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Mon, 16 Jul 2007 17:50:58 GMT]]></title><description><![CDATA[<p>Okay, wenn ich gewusst hätte das die STL-Template-Klasse &quot;Vector&quot; genau das macht was ich hier versucht habe zu programmieren dann hätte ich wohl drauf verzichtet diesen Thread aufzumachen...</p>
<p>Danke trotzdem !</p>
<p>Thema (ungelöst) erledigt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326763</guid><dc:creator><![CDATA[thomas233]]></dc:creator><pubDate>Mon, 16 Jul 2007 17:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Mon, 16 Jul 2007 21:48:48 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>sieht doch alles ganz gut aus.Bis auf das du ein T** m_Data hast. Mach da mal ein T* m_Data draus. Dann müsste es klappen.</p>
<p>Außerdem: Ich finds nich gut, bei jedem add speicher zu holen, der std::vector macht es zB so, dass er immer einen festen betrag speicher holt und nicht nur speicher für ein element.</p>
</blockquote>
<p>std::vector vergrössert den Speicher üblicherweise auf 150-200% von dem was er bereits &quot;hat&quot;. Anders könnte die O(1) Garantie (amortisiert) für push_back auch nicht eingehalten werden. std::vector kann also garnicht einen &quot;festen Betrag Speicher&quot; holen wenn die Implementierung den Standard erfüllen möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326840</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Jul 2007 21:48:48 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Referenzen-Array on Tue, 17 Jul 2007 07:35:52 GMT]]></title><description><![CDATA[<p>thomas233 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//template &lt;class T&gt;
    void setCapacity(int cap)
    {
        cap=count;
        data = (T*)realloc(data,sizeof(T)*cap);
    }
</code></pre>
<p>klappts mit dem Kompilieren zwar aber dafür wird dann bei der Speicherallokierung ein ungültiger Pointer allokiert.</p>
</blockquote>
<p>Nochmal hierzu: Dass das schiefgeht ist kein Wunder, denn das geht nur in extrem wenigen Fällen gut (genau: Wenn T ein POD ist). Du holst hier Speicher für n Ts, aber für kein einziges Objekt wird der Konstruktor aufgerufen, damit sind alle Objekte in dem Speicherbereich unbrauchbar. Wenn T z.B. ein std::string ist, liegen dort lauter strings, die ungültige (zufällige) Verwaltungsinformationen enthalten. Wenn Du darauf zugreifen möchtest: BUMM.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326967</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 17 Jul 2007 07:35:52 GMT</pubDate></item></channel></rss>