<?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[Singleton Fehler undefined reference]]></title><description><![CDATA[<p>Hallo alle Zusammen,</p>
<p>ich wollte ein Globales Objekt erstellen, dafür habe ich mich für Singleton entschieden.</p>
<p>Aber wenn ich folgenden Code</p>
<p>ZufallsGenerator.h:</p>
<pre><code class="language-cpp">#ifndef ZUFALLSGENERATOR_H_
#define ZUFALLSGENERATOR_H_

#include &lt;iostream&gt;
#include &lt;time.h&gt;
#include &lt;stdlib.h&gt;

class ZufallsGenerator
{
	static ZufallsGenerator* m_generator;

	ZufallsGenerator();
	~ZufallsGenerator();

	public:
		static ZufallsGenerator* holeGenerator();
		int holeZufallsInt() const;

};

#endif /*ZUFALLSGENERATOR_H_*/
</code></pre>
<p>ZufallsGenerator.cpp:</p>
<pre><code class="language-cpp">#include &quot;ZufallsGenerator.h&quot;

ZufallsGenerator::ZufallsGenerator()
{
	time_t t;
	srand(static_cast&lt;unsigned int&gt;(time(&amp;t)));
	rand();
}

ZufallsGenerator::~ZufallsGenerator()
{
}

ZufallsGenerator* ZufallsGenerator::holeGenerator() {
	return((ZufallsGenerator::m_generator) ? ZufallsGenerator::m_generator : ZufallsGenerator::m_generator=new ZufallsGenerator);
}
int ZufallsGenerator::holeZufallsInt() const {
	return(rand());
}
</code></pre>
<p>Und noch die main.cpp:</p>
<pre><code class="language-cpp">#include &quot;ZufallsGenerator.h&quot;

using namespace std;

int main()
{
	ZufallsGenerator* zg = ZufallsGenerator::holeGenerator();
	cout &lt;&lt; zg-&gt;holeZufallsInt() &lt;&lt; endl;
	cout &lt;&lt; zg-&gt;holeZufallsInt() &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>schreibe.</p>
<p>Bekomm ich Folgende Fehlermeldung, bin leicht am Verzweifeln:</p>
<blockquote>
<p>/tmp/ccenxSNS.o: In function <code>ZufallsGenerator::holeGenerator()': ZufallsGenerator.cpp:(.text+0x1be): undefined reference to</code>ZufallsGenerator::m_generator'<br />
ZufallsGenerator.cpp:(.text+0x1de): undefined reference to <code>ZufallsGenerator::m_generator' ZufallsGenerator.cpp:(.text+0x1e3): undefined reference to</code>ZufallsGenerator::m_generator'<br />
ZufallsGenerator.cpp:(.text+0x1ed): undefined reference to `ZufallsGenerator::m_generator'<br />
collect2: ld returned 1 exit status</p>
</blockquote>
<p>Vielen Dank schonmal</p>
<p>MfG</p>
<p>Patrick</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246114/singleton-fehler-undefined-reference</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 07:43:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246114.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Jul 2009 09:10:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 09:10:20 GMT]]></title><description><![CDATA[<p>Hallo alle Zusammen,</p>
<p>ich wollte ein Globales Objekt erstellen, dafür habe ich mich für Singleton entschieden.</p>
<p>Aber wenn ich folgenden Code</p>
<p>ZufallsGenerator.h:</p>
<pre><code class="language-cpp">#ifndef ZUFALLSGENERATOR_H_
#define ZUFALLSGENERATOR_H_

#include &lt;iostream&gt;
#include &lt;time.h&gt;
#include &lt;stdlib.h&gt;

class ZufallsGenerator
{
	static ZufallsGenerator* m_generator;

	ZufallsGenerator();
	~ZufallsGenerator();

	public:
		static ZufallsGenerator* holeGenerator();
		int holeZufallsInt() const;

};

#endif /*ZUFALLSGENERATOR_H_*/
</code></pre>
<p>ZufallsGenerator.cpp:</p>
<pre><code class="language-cpp">#include &quot;ZufallsGenerator.h&quot;

ZufallsGenerator::ZufallsGenerator()
{
	time_t t;
	srand(static_cast&lt;unsigned int&gt;(time(&amp;t)));
	rand();
}

ZufallsGenerator::~ZufallsGenerator()
{
}

ZufallsGenerator* ZufallsGenerator::holeGenerator() {
	return((ZufallsGenerator::m_generator) ? ZufallsGenerator::m_generator : ZufallsGenerator::m_generator=new ZufallsGenerator);
}
int ZufallsGenerator::holeZufallsInt() const {
	return(rand());
}
</code></pre>
<p>Und noch die main.cpp:</p>
<pre><code class="language-cpp">#include &quot;ZufallsGenerator.h&quot;

using namespace std;

int main()
{
	ZufallsGenerator* zg = ZufallsGenerator::holeGenerator();
	cout &lt;&lt; zg-&gt;holeZufallsInt() &lt;&lt; endl;
	cout &lt;&lt; zg-&gt;holeZufallsInt() &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>schreibe.</p>
<p>Bekomm ich Folgende Fehlermeldung, bin leicht am Verzweifeln:</p>
<blockquote>
<p>/tmp/ccenxSNS.o: In function <code>ZufallsGenerator::holeGenerator()': ZufallsGenerator.cpp:(.text+0x1be): undefined reference to</code>ZufallsGenerator::m_generator'<br />
ZufallsGenerator.cpp:(.text+0x1de): undefined reference to <code>ZufallsGenerator::m_generator' ZufallsGenerator.cpp:(.text+0x1e3): undefined reference to</code>ZufallsGenerator::m_generator'<br />
ZufallsGenerator.cpp:(.text+0x1ed): undefined reference to `ZufallsGenerator::m_generator'<br />
collect2: ld returned 1 exit status</p>
</blockquote>
<p>Vielen Dank schonmal</p>
<p>MfG</p>
<p>Patrick</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748070</guid><dc:creator><![CDATA[leus]]></dc:creator><pubDate>Thu, 23 Jul 2009 09:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 09:25:44 GMT]]></title><description><![CDATA[<p>Du musst <code>m_generator</code> noch ausserhalb der Klasse definieren..</p>
<pre><code class="language-cpp">ZufallsGenerator* ZufallsGenerator::m_generator = 0;
</code></pre>
<p>Allerdings würde ich abraten deinen Code zu benutzen. Das ist so schreklich..</p>
<p>1. Erzeugst du ein Memoryleak durch das fehlende <code>delete</code> auf das <code>new</code></p>
<p>2. Ist auch, wenn du irgendwo den Speicher freigibst nicht Exceptionsicher.</p>
<p>3. Ist das ganze auch nicht generisch. Wenn du jetzt ein weiteres Singleton brauchst, musst du das Verhalten erneut programmieren, was auch nicht wirklich der Sinn ist..</p>
<p>Schau dir am besten einmal ein paar Singleton Implementierungen an. Z.B reicht das Meyers Singleton meist:<br />
<a href="http://www.devarticles.com/c/a/Cplusplus/C-plus-plus-In-Theory-The-Singleton-Pattern-Part-I/4/" rel="nofollow">http://www.devarticles.com/c/a/Cplusplus/C-plus-plus-In-Theory-The-Singleton-Pattern-Part-I/4/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748084</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 23 Jul 2009 09:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 12:08:53 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>1. Erzeugst du ein Memoryleak durch das fehlende <code>delete</code> auf das <code>new</code></p>
</blockquote>
<p>Und das stört warum? Es kann ja nicht auflaufen. Es sind nur 32 Bytes, die bei Prozessende dann doch verschwinden.</p>
<blockquote>
<p>2. Ist auch, wenn du irgendwo den Speicher freigibst nicht Exceptionsicher.</p>
</blockquote>
<p>Ist mir gerade nicht aufgefalle. Wo ist das Problem genau?</p>
<blockquote>
<p>3. Ist das ganze auch nicht generisch. Wenn du jetzt ein weiteres Singleton brauchst, musst du das Verhalten erneut programmieren, was auch nicht wirklich der Sinn ist..</p>
</blockquote>
<p>Sehe ich nicht so. Es muß nicht allese generisch sein.</p>
<blockquote>
<p>Schau dir am besten einmal ein paar Singleton Implementierungen an. Z.B reicht das Meyers Singleton meist:</p>
</blockquote>
<p>Guter Tip.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748174</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 23 Jul 2009 12:08:53 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 12:21:21 GMT]]></title><description><![CDATA[<p>leus schrieb:</p>
<blockquote>
<p>ich wollte ein Globales Objekt erstellen, dafür habe ich mich für Singleton entschieden.</p>
</blockquote>
<p>Dürfte Unfug sein. Deine Signletonverwaltung kostet mehr Rechenzeit und Aufwand und Speicher und bringt keine Sicherheit oder Übersicht dazu und ist in der main schwieriger zu bedienen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;time.h&gt; //&lt;ctime&gt;
#include &lt;stdlib.h&gt; //&lt;cstdlib&gt;
</code></pre>
<pre><code class="language-cpp">ZufallsGenerator::ZufallsGenerator()
{
	time_t t;
	srand(static_cast&lt;unsigned int&gt;(time(&amp;t)));
	rand();
}
</code></pre>
<pre><code class="language-cpp">ZufallsGenerator::ZufallsGenerator()
{
	srand(time(0));
	rand();
}
</code></pre>
<p>Nett, daß Du das Muster srand();rand(); kennst. Nur sehr wenige tun das.</p>
<pre><code class="language-cpp">ZufallsGenerator::~ZufallsGenerator()
{
}
</code></pre>
<p>Hätte ich in der Klasse gemacht.</p>
<pre><code class="language-cpp">ZufallsGenerator* ZufallsGenerator::holeGenerator() {
	return((ZufallsGenerator::m_generator) ? ZufallsGenerator::m_generator : ZufallsGenerator::m_generator=new ZufallsGenerator);
}
</code></pre>
<p>Was soll das denn?</p>
<pre><code class="language-cpp">ZufallsGenerator* ZufallsGenerator::holeGenerator() {
	if(m_generator==0)
		m_generator=new ZufallsGenerator;
	return (((((((ZufallsGenerator::m_generator)))))));
}
</code></pre>
<p>Merke: return ist keine Funktion und bekommt keine Funktionsaufrufklammern.</p>
<pre><code class="language-cpp">int ZufallsGenerator::holeZufallsInt() const {
	return(rand());
}
</code></pre>
<p>Merke: return ist keine Funktion und bekommt keine Funktionsaufrufklammern.</p>
<p>Leider tut dein Generator gar nichts machen. Sinnvoll wird das erst, wenn er eigene Daten hat.Wenn Du also zwei Generatoren anlegen könntest, die dann auch zwei unabhängige Folgen liefern. Und genau dann verbietet sich wieder der SIngleton, weil Du auch brauchst, daß Du mehrere Generatoren haben kannst. Willst Du wirklich genau einen haben, hau ihn doch schnell als globale Variable hin. Aber jederzeit muß man sich für eine Aufgabe einen lokalen Generator holen dürfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748181</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 23 Jul 2009 12:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 12:24:52 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>1. Erzeugst du ein Memoryleak durch das fehlende <code>delete</code> auf das <code>new</code></p>
</blockquote>
<p>Und das stört warum? Es kann ja nicht auflaufen. Es sind nur 32 Bytes, die bei Prozessende dann doch verschwinden.</p>
</blockquote>
<p>?! - Wenn du das für sauber hälst.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>volkard schrieb:</p>
<blockquote>
<blockquote>
<p>2. Ist auch, wenn du irgendwo den Speicher freigibst nicht Exceptionsicher.</p>
</blockquote>
<p>Ist mir gerade nicht aufgefalle. Wo ist das Problem genau?</p>
</blockquote>
<p>Naja. Wo räumt er denn den Speicher wieder auf? - Wenn überhaupt irgendwo am Ende einer Funktion und wenn eine Exception fliegt wird es (wahrscheinlich) nicht aufgeräumt. Klar, muss nicht sein. Mit genug Erfahrung geht es auch anderst, allerdings wäre mir persönlich das zu umständlich für so etwas, wie ein Singleton wo es bessere Lösungen gibt.</p>
<p>volkard schrieb:</p>
<blockquote>
<blockquote>
<p>3. Ist das ganze auch nicht generisch. Wenn du jetzt ein weiteres Singleton brauchst, musst du das Verhalten erneut programmieren, was auch nicht wirklich der Sinn ist..</p>
</blockquote>
<p>Sehe ich nicht so. Es muß nicht allese generisch sein.</p>
</blockquote>
<p>Nicht alles, aber ich finde, dass sich hier Vererbung sehr eignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748184</guid><dc:creator><![CDATA[drakon@ausgesperrt]]></dc:creator><pubDate>Thu, 23 Jul 2009 12:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 12:47:39 GMT]]></title><description><![CDATA[<p>drakon@ausgesperrt schrieb:</p>
<blockquote>
<p>Nicht alles, aber ich finde, dass sich hier Vererbung sehr eignet.</p>
</blockquote>
<p>Daß im Kern einen Meyers-Singleton wohl sein wird, da sind wir uns einig, nehme ich an.</p>
<p>Die Zeilen</p>
<pre><code class="language-cpp">ZufallsGenerator* ZufallsGenerator::getInstance(){
  static ZufallsGenerator zuf;
  return &amp;zuf;
}
</code></pre>
<p>tun keinem weh.</p>
<p>Willst Du die nur templatisieren mit</p>
<pre><code class="language-cpp">T* Singleton::getInstance(){
  static T sing;
  return &amp;sing;
}
</code></pre>
<p>und reinmixen mit</p>
<pre><code class="language-cpp">class ZufallsGenerator::public Singleton&lt;ZufallsGenerator&gt;
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748202</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 23 Jul 2009 12:47:39 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 13:00:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Die Zeilen</p>
<pre><code class="language-cpp">ZufallsGenerator* ZufallsGenerator::getInstance(){
  static ZufallsGenerator zuf;
  return &amp;zuf;
}
</code></pre>
<p>tun keinem weh.</p>
</blockquote>
<p>Wobei ich mich wiederum frage warum man die Instanzanfrage public machen sollte (und dann stellt sich die Frage ob eine Referenz nicht sauberer wäre). Ich verwende (wenn ich den zum Singleton greife) nach außen hin eine statische Schnittstelle (Nach meiner Variante wäre ZufallsGenerator::holeZufallsInt eine statische Methode die sich intern die Instanz holt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748211</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 23 Jul 2009 13:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Thu, 23 Jul 2009 13:03:07 GMT]]></title><description><![CDATA[<p>Ja, würde ich so machen. Alleine aus dem Grund, dass der Namen konstant bleibt und dass ich der Klasse sofort ansehe, dass sie als Singleton gebraucht wird.</p>
<p>Dazu kommt halt nocht, dass ich es extrem sexy finde, wenn ein Singleton alleine dadurch machen kann, dass ich eine Vererbung anfüge. Es kommt wohl eher selten vor, dass ein Singleton notwendig ist, aber wenn, dann hat sich das mit einer Zeile erledigt. <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>Aber der Punkt ist nicht ohne Grund als letzter gekommen. Ist ja schlussendlich nur eine Entscheidung, die zu treffen ist, aber keinen groben Fehler darstellt. (natürlich können Punkte 1 und 2 auch gewollt sein, was aber eher unwahrscheinlich ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748213</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 23 Jul 2009 13:03:07 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton Fehler undefined reference on Fri, 24 Jul 2009 09:26:44 GMT]]></title><description><![CDATA[<p>Vielen Dank für die ganzen Antworten.</p>
<p>Diese Klasse hatte ich nur als Beispiel getest.</p>
<p>Ich wollte den Singleton dazu nutzen um auf eine PostgreSQl-Datenbank zu zugreifen.</p>
<p>Ich wollte verhindern, dass mehrere Zugriffe auf die Datenbank gemacht werden. Aus diesem Grund wollte ich eine Globale-Klasse als Datenbank-Verbindung.</p>
<p>In dieser Klasse habe ich dann noch die Abfrage vereinfachen, diese habe ich mit folgenden Code realisiert.</p>
<pre><code class="language-cpp">PGresult* Database::get_data(vector&lt;string&gt; sel,string table)
{
	if(!(this-&gt;initialze))
	{
		cout &lt;&lt; &quot;Database ist nicht initialsiert!&quot; &lt;&lt; endl;
	}
	else {
		PGresult *SQLExec;
		string get_data;
		get_data.append(&quot;select &quot;);
		for(unsigned i=0;i&lt;sel.size();i++) {
			get_data.append(sel[i]);
			if (i != sel.size() - 1)
				get_data.append(&quot; ,&quot;);
		}
		get_data.append(&quot; from &quot;);
		get_data.append(table);
		SQLExec = PQexec(this-&gt;conn, get_data.c_str());
		return SQLExec;
}
</code></pre>
<p>Gruß<br />
Patrick</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748732</guid><dc:creator><![CDATA[leus]]></dc:creator><pubDate>Fri, 24 Jul 2009 09:26:44 GMT</pubDate></item></channel></rss>