<?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[Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27;]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>wieder mal eine Frage. Ich habe versucht das hier gelernt und angeratene in die Tat umzusetzen und verwende für meine Funktion nun eine Klasse. Zunächst in einer Header Datei die Deklaration:</p>
<pre><code class="language-cpp">// ionization_cs.h

#ifndef IONIZATION_CS_H
#define IONIZATION_CS_H

class IonizationCS
{
public:
   IonizationCS(double ionization_potential);   // constructor
   ~IonizationCS();                             // destructor
   double get_cs_max(double T);
private:
   static double A1, A2, B1, B2, a0, N, Ry;
   double S, F1, F2, I;
};

#endif
</code></pre>
<p>Da ich nicht davon ausgehe, dass dieses Objekt kopiert wird, habe ich bisher auf einen Copy- und Assignment Constructor verzichtet (obwohl ich das Kapitel im C++ Primer gelesen habe, ich denke die Problematik kommt später).</p>
<p>Dann die Methoden brav in einer cpp Datai definiert</p>
<pre><code class="language-cpp">// ionization_cs.pp -- IonizationCS class methods
#include&lt;iostream&gt;
#include&lt;cmath&gt;
#include &quot;ionization_cs.h&quot;

using namespace std;

// initializing static class members
double IonizationCS::A1 = 0.94;
double IonizationCS::A2 = 1.13;
double IonizationCS::B1 = 2.3;
double IonizationCS::B2 = 22.0;
double IonizationCS::a0 = 5.3e-9;	// Bohrradius [a0] = cm
double IonizationCS::Ry = 13.6;		// Rydberg energy [Ry] = eV
double IonizationCS::N = 2;			// number of electrons per shell

// class methods

// constructor
IonizationCS::IonizationCS(double ionization_potential)
{
	I = ionization_potential;	
	S = 4 * M_PI * pow(a0,2)*pow(Ry/I,2);
}

// destructor
IonizationCS::~IonizationCS(){}

// get the maximal ionization cross section, simply depending on the energy of the primary electron,
// thus the energy of the secondary electron is W = T - I
// [sigma] = cm^2
inline double IonizationCS::get_cs_max(double T)
{
	const double t = T/I;
	F1 = A1 * log(t)/(t + B1);
	F2 = A2 / (t + B2);
	return //
	S * F1 * (t-1)/(2*pow(t,2)) * (t + 1 - (4 * sqrt(t))/(3 + t))	//
	+ S * F2 * (1 - 1/t - log(t)/(t+1));
}
</code></pre>
<p>Jetzt will ich das ganze natürlich nutzen:</p>
<pre><code class="language-cpp">// ionization_cs_plot.cpp
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;fstream&gt;
// personal header files
#include &quot;ionization_cs.h&quot;

using namespace std;

int main(){//

	double T = 80;
	double I = 12.6;
	class IonizationCS* p_cs = new IonizationCS(I);
	cout &lt;&lt; p_cs-&gt;get_cs_max(T) &lt;&lt; endl;

	delete p_cs;

return 0;

}
</code></pre>
<p>Das Kompilieren klappt auch wunderbar und nur beim Linken kracht es dann:</p>
<pre><code>g++ -Wall -pedantic -ansi -c ionization_cs.cpp
g++ -Wall -pedantic -ansi -c ionization_cs_plot.cpp
g++ -o &quot;ionization_cs_plot&quot; ionization_cs.o ionization_cs_plot.o
ionization_cs_plot.o: In function `main':
ionization_cs_plot.cpp:(.text+0x75): undefined reference to `IonizationCS::get_cs_max(double)'
collect2: ld returned 1 exit status
</code></pre>
<p>Der Syntax mit dem Pointer sollte doch richtig sein, also das Zugreifen auf eine Klassenfunktion mittels <em>-&gt;</em>. Wieso kracht es dann beim Linken? Die Klassenfunktion ist doch richtig definiert, oder nicht? Mittels inline (habe es auch mal ohne probiert, hat nix gebracht) und mittels Klassenzugehörigkeit IonizationCS::get_cs_max(double T). Ich würde ja irgendwie naiv auf einen Tippfehler tippen, aber dann hätte doch schon das Kompilieren von ionization_cs.cpp eine Fehlermeldung ausgeben müssen - oder nicht?</p>
<p>Oder sehe ich gerade den Wald vor lauter Bäumen nicht? <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>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301179/beim-linken-die-fehlermeldung-undefined-reference-to</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 07:40:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301179.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Mar 2012 11:03:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:04:25 GMT]]></title><description><![CDATA[<p>Hallo ihr Lieben,</p>
<p>wieder mal eine Frage. Ich habe versucht das hier gelernt und angeratene in die Tat umzusetzen und verwende für meine Funktion nun eine Klasse. Zunächst in einer Header Datei die Deklaration:</p>
<pre><code class="language-cpp">// ionization_cs.h

#ifndef IONIZATION_CS_H
#define IONIZATION_CS_H

class IonizationCS
{
public:
   IonizationCS(double ionization_potential);   // constructor
   ~IonizationCS();                             // destructor
   double get_cs_max(double T);
private:
   static double A1, A2, B1, B2, a0, N, Ry;
   double S, F1, F2, I;
};

#endif
</code></pre>
<p>Da ich nicht davon ausgehe, dass dieses Objekt kopiert wird, habe ich bisher auf einen Copy- und Assignment Constructor verzichtet (obwohl ich das Kapitel im C++ Primer gelesen habe, ich denke die Problematik kommt später).</p>
<p>Dann die Methoden brav in einer cpp Datai definiert</p>
<pre><code class="language-cpp">// ionization_cs.pp -- IonizationCS class methods
#include&lt;iostream&gt;
#include&lt;cmath&gt;
#include &quot;ionization_cs.h&quot;

using namespace std;

// initializing static class members
double IonizationCS::A1 = 0.94;
double IonizationCS::A2 = 1.13;
double IonizationCS::B1 = 2.3;
double IonizationCS::B2 = 22.0;
double IonizationCS::a0 = 5.3e-9;	// Bohrradius [a0] = cm
double IonizationCS::Ry = 13.6;		// Rydberg energy [Ry] = eV
double IonizationCS::N = 2;			// number of electrons per shell

// class methods

// constructor
IonizationCS::IonizationCS(double ionization_potential)
{
	I = ionization_potential;	
	S = 4 * M_PI * pow(a0,2)*pow(Ry/I,2);
}

// destructor
IonizationCS::~IonizationCS(){}

// get the maximal ionization cross section, simply depending on the energy of the primary electron,
// thus the energy of the secondary electron is W = T - I
// [sigma] = cm^2
inline double IonizationCS::get_cs_max(double T)
{
	const double t = T/I;
	F1 = A1 * log(t)/(t + B1);
	F2 = A2 / (t + B2);
	return //
	S * F1 * (t-1)/(2*pow(t,2)) * (t + 1 - (4 * sqrt(t))/(3 + t))	//
	+ S * F2 * (1 - 1/t - log(t)/(t+1));
}
</code></pre>
<p>Jetzt will ich das ganze natürlich nutzen:</p>
<pre><code class="language-cpp">// ionization_cs_plot.cpp
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;fstream&gt;
// personal header files
#include &quot;ionization_cs.h&quot;

using namespace std;

int main(){//

	double T = 80;
	double I = 12.6;
	class IonizationCS* p_cs = new IonizationCS(I);
	cout &lt;&lt; p_cs-&gt;get_cs_max(T) &lt;&lt; endl;

	delete p_cs;

return 0;

}
</code></pre>
<p>Das Kompilieren klappt auch wunderbar und nur beim Linken kracht es dann:</p>
<pre><code>g++ -Wall -pedantic -ansi -c ionization_cs.cpp
g++ -Wall -pedantic -ansi -c ionization_cs_plot.cpp
g++ -o &quot;ionization_cs_plot&quot; ionization_cs.o ionization_cs_plot.o
ionization_cs_plot.o: In function `main':
ionization_cs_plot.cpp:(.text+0x75): undefined reference to `IonizationCS::get_cs_max(double)'
collect2: ld returned 1 exit status
</code></pre>
<p>Der Syntax mit dem Pointer sollte doch richtig sein, also das Zugreifen auf eine Klassenfunktion mittels <em>-&gt;</em>. Wieso kracht es dann beim Linken? Die Klassenfunktion ist doch richtig definiert, oder nicht? Mittels inline (habe es auch mal ohne probiert, hat nix gebracht) und mittels Klassenzugehörigkeit IonizationCS::get_cs_max(double T). Ich würde ja irgendwie naiv auf einen Tippfehler tippen, aber dann hätte doch schon das Kompilieren von ionization_cs.cpp eine Fehlermeldung ausgeben müssen - oder nicht?</p>
<p>Oder sehe ich gerade den Wald vor lauter Bäumen nicht? <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>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193544</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:16:19 GMT]]></title><description><![CDATA[<p>Klaus82 schrieb:</p>
<blockquote>
<p>Der Syntax mit dem Pointer sollte doch richtig sein, also das Zugreifen auf eine Klassenfunktion mittels <em>-&gt;</em>. Wieso kracht es dann beim Linken? Die Klassenfunktion ist doch richtig definiert, oder nicht?</p>
</blockquote>
<p>Nö, sie ist inline und hat daher interne Bindung. Das ist sogar der einzig sinnvolle Einsatz von inline, wenn man dies erreichen möchte. Das was du dir hier erhoffst(Inlining der funktion), macht ein moderner Compiler automatisch, sofern er kann (und hier kann er <strong>nicht</strong>, sofern du nicht zur Linkzeit optimieren lässt)</p>
<blockquote>
<p>Mittels inline (habe es auch mal ohne probiert, hat nix gebracht)</p>
</blockquote>
<p>Huh? Sicher, dass du sonst alles richtig gemacht hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193548</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:16:19 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:12:42 GMT]]></title><description><![CDATA[<p>Das passiert weil deine Funktion inline Schlüsselwort davor hat. Das bedeutet die wird direkt in den Code kopiert und nicht aufgerufen. Dafür muss ihre Definition für die aufrufende Einheiten sichtbar sein.</p>
<p>P.S. So eine würde ich nie inlinen.. Die ist zu groß und kompliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193549</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:12:42 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:17:42 GMT]]></title><description><![CDATA[<p>Travor schrieb:</p>
<blockquote>
<p>Das bedeutet die wird direkt in den Code kopiert und nicht aufgerufen.</p>
</blockquote>
<p>Falsch. Das bedeutet, dass dem Compiler mitgeteilt wird, dass er schauen soll, ob es sich lohnt, die Funktion inline zu machen. Er darf das aber auch gerne ignorieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193552</guid><dc:creator><![CDATA[Inliner]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:21:45 GMT]]></title><description><![CDATA[<p>Inliner schrieb:</p>
<blockquote>
<p>Travor schrieb:</p>
<blockquote>
<p>Das bedeutet die wird direkt in den Code kopiert und nicht aufgerufen.</p>
</blockquote>
<p>Falsch. Das bedeutet, dass dem Compiler mitgeteilt wird, dass er schauen soll, ob es sich lohnt, die Funktion inline zu machen. Er darf das aber auch gerne ignorieren.</p>
</blockquote>
<p>Ich bleibe dabei, das ich Recht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193556</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:21:45 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:28:16 GMT]]></title><description><![CDATA[<p>*dass</p>
<p>Du liegst falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193561</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 11:51:23 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Klaus82 schrieb:</p>
<blockquote>
<p>Mittels inline (habe es auch mal ohne probiert, hat nix gebracht)</p>
</blockquote>
<p>Huh? Sicher, dass du sonst alles richtig gemacht hast?</p>
</blockquote>
<p>Verdammt, scheinbar nicht. Hab eben das inline mal weggenommen und jetzt funktioniert es. Dann muss vorher beim Probieren etwas verdummbeutelt haben. Sorry! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Puh, bei der Verwendung von <em>inline</em> bin ich jetzt aber auch irritiert.</p>
<p>Also prinzipiell kann ich ja eine Klassenfunktion in der Deklaration definieren (und zunächst deklarieren) oder nicht.<br />
Also die beiden folgenden Beispiele sind gleich:</p>
<pre><code>class Name{
  double any_function(){ return something; }
};

// --- ODER ---

className{
  double any_function();
};

double className::any_function()
{
  return something;
}
</code></pre>
<p>Das geht auf jeden Fall und hat noch nichts mit <em>inline</em> zu tun.</p>
<p>Jetzt steht hier aber z.B. im C++ Primer</p>
<blockquote>
<p>The easiest way to make sure that inline definitions are avaible to all files in a multifile programm is to include the inline definition in the same header file in which the corresponding class is defiened.</p>
</blockquote>
<p>Mag zwar der einfachste Weg sein, doch nachdem was ich hier gelernt habe, sollen Definition nicht in header files, sondern nur Deklarationen. Also vergesse ich das schnell wieder.</p>
<p>Aber weiterhin steht noch</p>
<blockquote>
<p>Incidentally, according to the <strong>rewrite rules</strong>, defining a method in a class declaration is equivalent to replacing the method definition with prototyp and then rewriting the definition as an inline function immediatly after the class declaration.</p>
</blockquote>
<p>Also warum geht es dann nicht?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193584</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 21 Mar 2012 11:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 12:12:36 GMT]]></title><description><![CDATA[<p>Also in erster Linie heißt Inline erst einmal, dass die Methode sich so verhält, als hätte sie interne Bindung (die genauen Regeln sind leicht anders). Also ungefähr so, als wäre sie static.<br />
Die Sache mit dem Einbauen der Methode in den Code ist eher ein Hinweis an den Compiler, den dieser sowieso ignoriert. Wenn der Compiler einen Funktionsaufruf sieht <strong>und</strong> den Code dieser Funktion sieht, dann macht er sich ohnehin ein eigenes Bild, inline oder nicht. Wenn er den Code nicht sehen kann, kann er ohnehin nichts inlinen, egal ob die Funktion inline ist oder nicht. Denn er muss ja den Code haben, um ihn einbauen zu können.</p>
<p>Daher:<br />
Eine Inlinefunktion in einem getrennten Modul ist komplett sinnlos. Das ist das was du hier hattest. Der Compiler sieht nicht den Code während der Übersetzung der Module die die Funktion benutzen und kann die Funktion daher nicht inlinen. Und beim Linken bekommt man einen Fehler, weil die Funktion nicht sichtbar ist.</p>
<p>Wie bekommt man eine Funktion nun Inline (im Sinne des Codeeinbauens)?<br />
Wenn man sie in einem anderen Modul hat, hat man, wie erklärt, sowieso schlechte Karten. Neuerdings bieten viele Compiler auch Optimierung zur Linkzeit, dann geht das auch. Aber so ganz ausgereift würde ich die Technik noch nicht nennen, insbesondere muss man sich gut mit dem Buildprozess auskennen, um alles richtig zu machen.<br />
Methoden die Inline werden sollen, müssen daher stets sichtbar sein. Wo sind sie das? Im Header! Also im Header definieren. Aber oh weh! Das gibt mehrfache Definitionen und Probleme beim Linken. Die Methode darf beim Linken also nicht sichtbar sein, muss interne Bindung haben. <strong>Und nun schließt sich der Kreis:</strong> Man macht die Methode im Header inline. Oh, Wunder! Die Sprache scheint wohl doch ganz gut durchdacht zu sein <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>
<blockquote>
<p>Mag zwar der einfachste Weg sein, doch nachdem was ich hier gelernt habe, sollen Definition nicht in header files, sondern nur Deklarationen. Also vergesse ich das schnell wieder.</p>
</blockquote>
<p>Dann hast du das entweder falsch verstanden oder jemand hat es falsch erklärt ,der es vorher falsch verstanden hat. Hier gibt es öfters schlechte Tipps von Leuten, die selber gute Tipps bekommen haben, aber diese nicht ganz verstanden haben und sie nun übereifrig an andere weitergeben, obwohl sie an der Stelle gar nicht passen.</p>
<p>Ich schreibe fast alle kurzen Methoden in den Header und die Ausführungsgeschwindigkeit meiner Programme dankt mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193596</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Mar 2012 12:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 13:44:10 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Methoden die Inline werden sollen, müssen daher stets sichtbar sein. Wo sind sie das? Im Header! Also im Header definieren. Aber oh weh! Das gibt mehrfache Definitionen und Probleme beim Linken. Die Methode darf beim Linken also nicht sichtbar sein, muss interne Bindung haben. <strong>Und nun schließt sich der Kreis:</strong> Man macht die Methode im Header inline. Oh, Wunder! Die Sprache scheint wohl doch ganz gut durchdacht zu sein <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>Ich schreibe fast alle kurzen Methoden in den Header und die Ausführungsgeschwindigkeit meiner Programme dankt mir.</p>
</blockquote>
<p>Okay,<br />
also mache ich anstatt einer separaten header und cpp Datei <em>eine</em> Header Datei, in der mittels inline die Methoden schon drinstehen?</p>
<pre><code class="language-cpp">// ionization_cs.h

#ifndef IONIZATION_CS_H
#define IONIZATION_CS_H

class IonizationCS
{
public:
	IonizationCS(double ionization_potential);	// constructor
	~IonizationCS();										// destructor
	double get_cs_max(double T);
private:
	static double A1, A2, B1, B2, a0, N, Ry;
	double S, F1, F2, I;
};

// constructor
inline IonizationCS::IonizationCS(double ionization_potential)
{
	I = ionization_potential;
// initializing static class members
	A1 = 0.94;
	A2 = 1.13;
	B1 = 2.3;
	B2 = 22.0;
	a0 = 5.3e-9;	// Bohrradius [a0] = cm
	Ry = 13.6;		// Rydberg energy [Ry] = eV
	N = 2;				// number of electrons per shell
	S = 4 * M_PI * pow(a0,2)*pow(Ry/I,2);
}

// destructor
inline IonizationCS::~IonizationCS(){}

// get the maximal ionization cross section, simply depending on the energy of the primary electron,
// thus the energy of the secondary electron is W = T - I
// [sigma] = cm^2
inline double IonizationCS::get_cs_max(double T)
{
	const double t = T/I;
	F1 = A1 * log(t)/(t + B1);
	F2 = A2 / (t + B2);
	return //
	S * F1 * (t-1)/(2*pow(t,2)) * (t + 1 - (4 * sqrt(t))/(3 + t))	//
	+ S * F2 * (1 - 1/t - log(t)/(t+1));
}

#endif
</code></pre>
<p>EDIT:<br />
Nein, ich muss noch das static herausnehmen, sonst knall es wieder!!</p>
<p>Jetz läuft es aber! <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>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193658</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 21 Mar 2012 13:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 13:55:34 GMT]]></title><description><![CDATA[<p>Ja, so zum Beispiel. Wobei du es dann auch gleich mit in die Klassendefinition schreiben kannst. Und wobei diese Funktionen schon ziemlich groß und komplex sind.</p>
<p>Was mir aber gerade auffällt ist, dass da ganz was abgefahrenes mit deinen statischen Membern abgeht. Du reinitialisierst die, wenn ein neues Objekt erzeugt wird? Das ist ganz schön merkwürdiges Verhalten. Und geändert werden sie danach auch nie. Wieso sind das dann keine Konstanten?<br />
Und alle Member, egal ob static oder nicht, außer I und S, werden nur in einer Funktion benutzt. Warum sind I und S nicht die einzigen Member (die dann übrigens auch besser in einer Initialisierungsliste initialisiert würden) und der Rest funktionslokal in get_cs_max?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Du sorgst dich also anscheinend um kleine Effizienzgewinne(inline), dafür machst du bei der grundlegenden Modellierung solche dicken Hauer (die dich am Ende dann auch Effizienz kosten werden). Da trifft mal wieder der berühmte Spruch zu, dass frühzeitigen Optimierung die Wurzel allen Übels ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>edit: Ach, jetzt hast du deinen Beitrag geändert, während ich geantwortet habe. Im wesentlichen passt meine Antwort aber noch.</p>
<p>statische Member müssen übrigens irgendwo leben (also irgendwo definiert werden), sonst knallt's beim Linken. Das dürftest du hier beobachtet haben.</p>
<p>edit2: Und der leere Destruktor ist auch typischer Cargo Cult.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193672</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Mar 2012 13:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Linken die Fehlermeldung &#x27;undefined reference to&#x27; on Wed, 21 Mar 2012 18:40:08 GMT]]></title><description><![CDATA[<p>Puh,<br />
du bringst mich ja wieder ganz schön zum Grübeln - aber so soll es schließlich sein, sonst hätte ich mich hier nicht angemeldet! <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>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Was mir aber gerade auffällt ist, dass da ganz was abgefahrenes mit deinen statischen Membern abgeht. Du reinitialisierst die, wenn ein neues Objekt erzeugt wird? Das ist ganz schön merkwürdiges Verhalten. Und geändert werden sie danach auch nie. Wieso sind das dann keine Konstanten?</p>
</blockquote>
<p>Also das Problem mit <em>const</em> ist ja, dass es nicht getrennt deklarieren und später initialisieren kann.<br />
Das ganze lässt sich allerdings bei einer Klasse im Konstruktor als Ausnahme realisieren, wenn ich das richtig verstanden habe laut <a href="http://de.wikipedia.org/wiki/Initialisierungsliste" rel="nofollow">Wikieintrag</a>.<br />
Und dazu habe ich jetzt mal folgendes gebastelt:</p>
<pre><code class="language-cpp">class IonizationCS
{
public:
	IonizationCS(double ionization_potential);	// constructor
	double get_cs_max(double T);
private:
	const double A1, A2, B1, B2, a0, Ry, N;
	double S, F1, F2, I;
};

// constructor
inline IonizationCS::IonizationCS(double ionization_potential):
	A1(0.94), A2(1.13), B1(2.3), B2(22.0),//
	a0(5.3e-9),	// Bohrradius [a0] = cm
	Ry(13.6),		// Rydberg energy [Ry] = eV
	N(2)				// number of electrons per shell
{
	I = ionization_potential;
	S = 4 * M_PI * N * pow(a0,2)*pow(Ry/I,2);
}
</code></pre>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Und alle Member, egal ob static oder nicht, außer I und S, werden nur in einer Funktion benutzt. Warum sind I und S nicht die einzigen Member (die dann übrigens auch besser in einer Initialisierungsliste initialisiert würden) und der Rest funktionslokal in get_cs_max?</p>
</blockquote>
<p>Das verstehe ich jetzt nicht. Ich habe also meine physikalischen Konstanten in eine Initialisierungliste gepackt, aber wieso I und S?</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Du sorgst dich also anscheinend um kleine Effizienzgewinne(inline), dafür machst du bei der grundlegenden Modellierung solche dicken Hauer (die dich am Ende dann auch Effizienz kosten werden). Da trifft mal wieder der berühmte Spruch zu, dass frühzeitigen Optimierung die Wurzel allen Übels ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
</blockquote>
<p>Accepted - I am working on that!!</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>statische Member müssen übrigens irgendwo leben (also irgendwo definiert werden), sonst knallt's beim Linken. Das dürftest du hier beobachtet haben.</p>
</blockquote>
<p>Ja, das habe ich hier gemerkt. Aber wo müssen sie leben, dass sie global zur Verfügung stehen?<br />
Soweit ich das verstanden habe reden wir ein wenig über den Unterschied zwischen <em>const</em> und <em>static</em>. Das Erste habe ich ein wenig als Selbstschutz des Programmierers verstanden. Also wenn er Variablen mit einem konstanten Wert haben möchte, dann deklariert er das ganze als <em>const</em> und kriegt einen Fehler ausgegeben, falls der Wert zur Laufzeit geändert werden würde (was ja nicht sein soll!)<br />
Das Zweite ist ein wenig anders motiviert. Nämlich für den Fall, dass von dem Objekt der Klasse Kopien angelegt werden sollen, so wird das für <em>static</em> Members vermieden.<br />
Bei mir würden Kopien angelegt werden, da mit jeder Kopie der Konstruktor aufgerufen wird, der wiederum ...</p>
<p>Auf der anderen Seite versuche ich auch ganz allgemein so viel wie möglich schon zu deklarieren, dass ich später nur noch initialisieren muss - also Werte zuweisen. Ich dachte dann spare ich die Hälfte an Zeitaufwand.<br />
Allerdings beißt sich da gerade für <em>const</em> Werte die Katze in den Schwanz. Bzw. im Sinne der physik. Konstanten, die einfach allgemein zur Verfügung stehen sollen, reden wir ja eher über <em>static</em>.</p>
<p>Mir dreht sich langsam der Kopf ...</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>edit2: Und der leere Destruktor ist auch typischer <strong>Cargo Cult</strong>.</p>
</blockquote>
<p>Wieder was gelernt.</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193784</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 21 Mar 2012 18:40:08 GMT</pubDate></item></channel></rss>