<?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[probleme mit Vector]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich bin noch recht neu in der Programmierung mit C++...</p>
<p>Ich versuche eine Klasse in ein Vector zu packen.</p>
<pre><code>class Clients
{
};
</code></pre>
<p>In der main.cpp hab ich:</p>
<pre><code>std::vector&lt;Clients&gt; clients;
</code></pre>
<p>so... auf folgenden Wegen habe ich es probiert und mir kamen dann auch Fehlermeldungen:</p>
<p>1:</p>
<pre><code>Clients *c = new Clients();
clients.push_back(c);
-------------------------------
error C2664: 'std::vector&lt;_Ty&gt;::push_back': Konvertierung des Parameters 1 von 'Clients *' in 'const Clients &amp;' nicht möglich
</code></pre>
<p>2:</p>
<pre><code>Clients *c = new Clients();
clients.push_back(&amp;c);
-------------------------------
error C2664: 'std::vector&lt;_Ty&gt;::push_back': Konvertierung des Parameters 1 von 'Clients **' in 'const Clients &amp;' nicht möglich
</code></pre>
<p>Kann mir jemand sagen was ich falsch mache? (google hat mir nicht geholfen.. Hab auch C++ Bücher da die mir nicht wirklich helfen.)</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304976/probleme-mit-vector</link><generator>RSS for Node</generator><lastBuildDate>Wed, 24 Jun 2026 03:14:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304976.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Jun 2012 14:37:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:37:39 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich bin noch recht neu in der Programmierung mit C++...</p>
<p>Ich versuche eine Klasse in ein Vector zu packen.</p>
<pre><code>class Clients
{
};
</code></pre>
<p>In der main.cpp hab ich:</p>
<pre><code>std::vector&lt;Clients&gt; clients;
</code></pre>
<p>so... auf folgenden Wegen habe ich es probiert und mir kamen dann auch Fehlermeldungen:</p>
<p>1:</p>
<pre><code>Clients *c = new Clients();
clients.push_back(c);
-------------------------------
error C2664: 'std::vector&lt;_Ty&gt;::push_back': Konvertierung des Parameters 1 von 'Clients *' in 'const Clients &amp;' nicht möglich
</code></pre>
<p>2:</p>
<pre><code>Clients *c = new Clients();
clients.push_back(&amp;c);
-------------------------------
error C2664: 'std::vector&lt;_Ty&gt;::push_back': Konvertierung des Parameters 1 von 'Clients **' in 'const Clients &amp;' nicht möglich
</code></pre>
<p>Kann mir jemand sagen was ich falsch mache? (google hat mir nicht geholfen.. Hab auch C++ Bücher da die mir nicht wirklich helfen.)</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224549</guid><dc:creator><![CDATA[JayJayW]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:39:07 GMT]]></title><description><![CDATA[<p>Das muss lauten</p>
<pre><code class="language-cpp">std::vector&lt;Clients*&gt; clients;
</code></pre>
<p>Du willst ja nicht Instanzen von Clients speichern sondern nur Zeiger darauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224551</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:41:55 GMT]]></title><description><![CDATA[<p>Warum legst du die Objekte mit new an, wenn du im vector keine Zeiger verwendest? (Denk dran das zu jedem new ein delete gehört).</p>
<p>Üblicherweise arbeitet man hier so:</p>
<pre><code class="language-cpp">clients.push_back(Clients());

// oder

Clients c;
clients.push_back(c);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2224552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224552</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:42:04 GMT]]></title><description><![CDATA[<p>Vielleicht einen std::vector&lt;Client*&gt; ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224554</guid><dc:creator><![CDATA[IrgendeinName]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:42:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;Clients&gt; clients;
Clients c;
clients.push_back(c);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2224555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224555</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:42:49 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:46:58 GMT]]></title><description><![CDATA[<p>wow... so einfach ;)... Vielen Dank :)...</p>
<p>Ich möchte 50x die Klasse Client anlegen (da wird jeweils 1 Socket übergeben)... Damit wenn neue Verbindungen kommen (habe auch einen Server mit eingehenden Verbindungen) ich diesen Verbindungen einen Socket zuordnen kann (so ein Weiterleitungsprinzip)... Muss also immer darauf zugreifen können ;).</p>
<p>Ich komme größtenteils von Java... Da würde man das mit einem Vector machen.. den man dann in einer for schleife durchlaufen lässt um rauszufinden welcher dieser 50 gerade nichts zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224559</guid><dc:creator><![CDATA[JayJayW]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:46:58 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 14:57:09 GMT]]></title><description><![CDATA[<p>JayJayW schrieb:</p>
<blockquote>
<p>Ich versuche eine Klasse in ein Vector zu packen.</p>
</blockquote>
<p>Objekte</p>
<p>JayJayW schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Clients
{
};
</code></pre>
<p>In der main.cpp hab ich:</p>
<pre><code class="language-cpp">std::vector&lt;Clients&gt; clients;
</code></pre>
</blockquote>
<p>Sicher, dass die Klasse nicht <code>Client</code> heißen sollte?</p>
<p>JayJayW schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Clients *c = new Clients();
clients.push_back(c);
</code></pre>
</blockquote>
<p>Wie kommst du auf <code>new</code> ? C++ ist nicht Java.</p>
<p>Man speichert die Objekte direkt, wenn deren spätere Adresse keine Rolle spielt.<br />
<code>vector</code> kopiert die Objekte beim Wachsen (z. B. <code>push_back</code> ) in einen neuen Speicherbereich, also ändern sich die Adressen der enthaltenen Objekte. Das ist nur dann ein Problem, wenn das Programm irgendwo anders Zeiger oder Referenzen auf Objekte in dem <code>vector</code> speichert und erwartet, dass diese (nach weiteren <code>push_back</code> s) gültig bleiben.</p>
<pre><code class="language-cpp">std::vector&lt;Client&gt; clients;
clients.push_back(Client());
</code></pre>
<p>Damit sich die Adressen der Objekte nicht ändern, kann man Indirektion verwenden. Anstelle der Objekte selbst speichert man im <code>vector</code> nur Zeiger auf die Objekte. Die tatsächlichen Objekte liegen irgendwo anders und bleiben da, solange der Zeiger existiert. So ein Objekt wird mit <code>new</code> erstellt und dann einem <code>unique_ptr</code> übergeben. Wird der Zeiger zerstört, zerstört er auch das eigentliche Objekt.</p>
<pre><code class="language-cpp">std::vector&lt;std::unique_ptr&lt;Client&gt;&gt; clients;
clients.push_back(std::unique_ptr&lt;Client&gt;(new Client));
</code></pre>
<p>Rohe Zeiger drücken niemals ein Besitzverhältnis aus, das ist in C++ so nicht vorgesehen. Wird zwar oft gemacht, ist aber falsch:</p>
<pre><code class="language-cpp">Client *c = new Client;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2224563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224563</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 18 Jun 2012 14:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 19:13:28 GMT]]></title><description><![CDATA[<p>ok also ich hoffe ich habe das richtig verstanden... Ich muss:</p>
<pre><code>std::vector&lt;std::unique_ptr&lt;Client&gt;&gt; clients;
clients.push_back(std::unique_ptr&lt;Client&gt;(new Client));
</code></pre>
<p>benutzen damit die Klassen im selben Speicherbereich bleiben und ich immer wieder darauf zugreifen kann... Nun kann ich auch mit:</p>
<pre><code>for (vector&lt;std::unique_ptr&lt;Client&gt;&gt;::iterator it = clients.begin(); it!=clients.end(); ++it) 
{
    Clients c = *it;
}
</code></pre>
<p>darauf zugreifen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224734</guid><dc:creator><![CDATA[JayJayW]]></dc:creator><pubDate>Mon, 18 Jun 2012 19:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 19:31:16 GMT]]></title><description><![CDATA[<p>JayJayW schrieb:</p>
<blockquote>
<p>benutzen damit die Klassen im selben Speicherbereich bleiben</p>
</blockquote>
<p>Objekte</p>
<p>JayJayW schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (vector&lt;std::unique_ptr&lt;Client&gt;&gt;::iterator it = clients.begin(); it!=clients.end(); ++it) 
{
    Clients c = *it;
}
</code></pre>
</blockquote>
<p>Das legt eine Kopie namens <code>c</code> an. Was du aber wahrscheinlich willst, ist eine Referenz <code>Client &amp;c = *it</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224752</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 18 Jun 2012 19:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 20:08:26 GMT]]></title><description><![CDATA[<p>Jetzt bekomme ich:</p>
<pre><code>#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;vector&gt;
#include &lt;winsock.h&gt;

#pragma comment(lib, &quot;Iphlpapi.lib&quot;)
#pragma comment(lib, &quot;ws2_32.lib&quot;)

#include &quot;Clients.h&quot;

using namespace std;

std::vector&lt;std::unique_ptr&lt;Clients&gt;&gt; clients; 

Zeile 19: clients.push_back(std::unique_ptr&lt;Clients&gt;(new Clients()));

main.cpp(19) : error C2039: 'unique_ptr': Ist kein Element von 'std'
main.cpp(19) : error C2065: 'unique_ptr': nichtdeklarierter Bezeichner
main.cpp(19) : error C2275: 'Clients': Ungültige Verwendung dieses Typs als Ausdruck
main.cpp(19) : error C2143: Syntaxfehler: Es fehlt ';' vor '&gt;'
main.cpp(19) : error C2059: Syntaxfehler: '&gt;'
</code></pre>
<p>Java ist doch etwas einfacher :).. Ich kann aber leider nicht auf Java zurück greifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224774</guid><dc:creator><![CDATA[JayJayW]]></dc:creator><pubDate>Mon, 18 Jun 2012 20:08:26 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 22:37:56 GMT]]></title><description><![CDATA[<p>Also ich habe das Problem nun lösen können indem ich das weg gelassen habe (ich hoffe das macht nichts)...</p>
<p>Ich poste hier mal etwas mehr Code:</p>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;vector&gt;
#include &lt;winsock.h&gt;

#pragma comment(lib, &quot;Iphlpapi.lib&quot;)
#pragma comment(lib, &quot;ws2_32.lib&quot;)

#include &quot;Clients.h&quot;
#include &quot;main.h&quot;

using namespace std;

SOCKET server;
//vector&lt;unique_ptr&lt;Clients&gt;&gt; clients; 
vector&lt;Clients&gt; clients;

SOCKET sock[50];
HANDLE threads[50];

int pos = 0;

DWORD WINAPI HandleClients(LPVOID data)
{
	int cur = reinterpret_cast&lt;int&gt;(data);

	string receive = &quot;&quot;;
	receive = receiveFromSock(sock[cur]);

	if(receive.find(&quot;&lt;--&gt;&lt;--&gt;..ADCLIENT..&lt;--&gt;&lt;--&gt;&quot;) != -1)
	{
		Clients c = Clients(sock[cur]);

		clients.push_back(c);

		DWORD ff;
		GetExitCodeThread(threads[cur],&amp;ff);
		ExitThread(ff);
		return 0;
	}

	Clients c = fetchClient();

	send(c.GetSocket(),receive.c_str(),receive.length(),0);

	receive = receiveFromSock(c.GetSocket());

	send(sock[cur],receive.c_str(),receive.length(),0);

	closesocket(sock[cur]);

	c.SetBusy(false);

	DWORD ff;
	GetExitCodeThread(threads[cur],&amp;ff);
	ExitThread(ff);
	return 0;
}

Clients fetchClient()
{
	bool found = false;

	while(!found)
	{
		for (vector&lt;Clients&gt;::iterator it = clients.begin(); it!=clients.end(); ++it)
		{
			Clients &amp;c = *it;

			if(c.GetSocket() == INVALID_SOCKET)
			{
				clients.erase(it);
				continue;
			}

			if(!c.IsBusy())
			{
				c.SetBusy(true);
				found = true;
				return c;
			}
		}

		if(!found)
		{
			Sleep(5000);
		}
	} 
}

int startServer()
{

	unsigned long id;
	while(TRUE)
	{
		cout &lt;&lt; &quot;warte\n&quot;;

		sock[pos] = accept(server,(LPSOCKADDR)&amp;serv_addr2,&amp;size);

		threads[pos] = CreateThread(NULL,0,&amp;HandleClients,(LPVOID)pos,0,&amp;id);

		Sleep(100);
		if(pos == 50)
		{
			pos = 0;
		}else{
			pos++;
		}
	}

	return 1;
}

int main()
{
	startServer();

	return 0;
}
</code></pre>
<p>----------------------------------------------------------------------------<br />
Clients.h</p>
<pre><code class="language-cpp">#pragma once

#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;winsock.h&gt;

#pragma comment(lib, &quot;ws2_32.lib&quot;)

using namespace std;

class Clients
{
public:
	Clients::Clients(SOCKET s);
	Clients::~Clients();

	SOCKET GetSocket();

	void SetBusy(bool value);
	bool IsBusy();

	SOCKET sock;
	bool busy;
};

Clients::Clients(SOCKET s)
{
	printf(&quot;SOCKET: %s\n&quot;,s.ToString());
	this-&gt;sock = s;
	this-&gt;busy = false;
}
Clients::~Clients()
{
	closesocket(this-&gt;sock);
}

SOCKET Clients::GetSocket()
{
	return this-&gt;sock;
}

void Clients::SetBusy(bool value)
{
	this-&gt;busy = value;
}
bool Clients::IsBusy()
{
	return this-&gt;busy;
}
</code></pre>
<p>Es geht darum das ich einfach z.B. 10 Grundsockets habe an die ich alle Anfragen an feste Verbindungen weiterleiten muss (Clients) und deren Antwort an normale Verbindungen die kommen und gehen...</p>
<p>Mein Problem ist jetzt folgendes... Wenn ich:</p>
<pre><code>Clients c = fetchClient();
</code></pre>
<p>aufrufe bekomme ich zwar ein Client als Rückgabewert, welcher aber nicht in der Lage ist, zu senden und zu empfangen.</p>
<p>Ich hoffe ihr wisst Rat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224816</guid><dc:creator><![CDATA[JayJayW]]></dc:creator><pubDate>Mon, 18 Jun 2012 22:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Mon, 18 Jun 2012 23:24:44 GMT]]></title><description><![CDATA[<p>Ich weiß gar nicht, wo ich anfangen soll. Dein Code hat so viele Probleme.</p>
<p>main.cpp:<br />
- Zeilen 8, 9: Das linken von Libs gehört einfach nicht in den Code. Mach das in den Einstellungen.<br />
- Zeilen 31, 108: Niemand garantiert dir, dass void* &gt;= int ist. Das ist zwar auf x86-Systemen der Fall, aber auf sowas würde ich mich niemals verlassen. Du solltest die Adresse von pos übergeben.<br />
- Zeilen 38, 48, 67: Du kopierst einen Client, das ist garantiert nicht, was du möchtest. Du solltest deine Client-Klasse nicht-kopierbar machen durch privaten Copy-Ctor und Copy-Assignment-Op.<br />
- Zeilen 111-116: Wie wäre es mit:</p>
<pre><code class="language-cpp">++pos %= 50;
</code></pre>
<p>Clients.h:<br />
- Die Klasse sollte immer noch &quot;Client&quot; heißen.<br />
- Zeile 29: printf ist C. Ich dachte wir machen C++?<br />
- Zeile 29: Ich kann mir nicht vorstellen, dass SOCKET eine .ToString()-Methode hat.<br />
- Keine Initialisierungsliste im Konstruktor verwendet.<br />
- this-&gt; zum Zugriff auf Klassenmember kannst du weglassen. Das braucht man so gut wie nie.</p>
<p>Generelles:<br />
- Du scheinst das C++-Objektmodell nicht verstanden zu haben.<br />
- Du vermischst überall C++ mit C und WinAPI. Dadurch ist dein Code unportabel und unwartbar.<br />
- Fehlerbehandlung hast du (so gut wie) keine.<br />
- Was Thread-Safety angeht, hab ich mir deinen Code jetzt gar nicht erst angesehen. In der Hinsicht dürfte so ziemlich alles explodieren.</p>
<p>Und nebenbei hab ich nicht verstanden, was ein &quot;busy&quot;-Client ist.</p>
<p>Ich fürchte, ein Server ist einfach noch zu viel für dich. Du solltest erstmal ein solides Wissen an Grundlagen haben, bevor du dich an sowas wagst. Sobald du das hast, solltest du außerdem eine Biliothek, etwa boost.asio, SFML oder Poco dafür verwenden. Die kapseln dir den hässlichen Plattform-spezifischen Code weg.</p>
<p>Und bevor du so einen Server schreibst, schreib erstmal einen Server, der Clients seriell bearbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224833</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 18 Jun 2012 23:24:44 GMT</pubDate></item><item><title><![CDATA[Reply to probleme mit Vector on Tue, 19 Jun 2012 07:22:46 GMT]]></title><description><![CDATA[<p>Wie schon gesagt bin ich ziemlich neu in C++ :D... Aber danke für die Ratschläge ich werde mein Wissen auch noch erweitern... Aber wegen genau diesen Codezeilen bin ich zu C++ gekommen. Daher brauche ich auch dringend die Lösung dieses Problems ;).</p>
<p>Ales funktioniert bis auf die Client/Vector Geschichte.</p>
<p>Ein Busy-Client ist ein Client welche gerade eine Anfrage bearbeitet und deshalb momentan nicht zur Verfügung steht.</p>
<p>Kann mir jemand bei meinem Clients/Vector Problem helfen? ;).</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2224870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2224870</guid><dc:creator><![CDATA[JayJayW]]></dc:creator><pubDate>Tue, 19 Jun 2012 07:22:46 GMT</pubDate></item></channel></rss>