<?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[c++, Verberung, warum krieg ich hier einen linker Fehler?]]></title><description><![CDATA[<pre><code>class CBaseClass
{
public :

   CBaseClass ()
   {
      GetStr ();
   }

   virtual CString GetStr ();
};

class CSubClass : public CBaseClass
{
public :

   CString GetStr ()
   {
      return &quot;&quot;;
   }
};
</code></pre>
<p>SrvFileExport error LNK2019: Nicht aufgelöstes externes Symbol '&quot;public: virtual class ATL::CStringT&lt;char,class ATL::StrTraitATL&lt;char,class ATL::ChTraitsCRT&lt;char&gt; &gt; &gt; __thiscall CBaseClass::GetStr(void)&quot; (?GetStr@CBaseClass@@UAE?AV?<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>S</mi><mi>t</mi><mi>r</mi><mi>i</mi><mi>n</mi><mi>g</mi><mi>T</mi><mi mathvariant="normal">@</mi><mi>D</mi><mi>V</mi><mo>?</mo></mrow><annotation encoding="application/x-tex">CStringT@DV?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.07153em;">C</span><span class="mord mathit" style="margin-right:0.05764em;">S</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">i</span><span class="mord mathit">n</span><span class="mord mathit" style="margin-right:0.03588em;">g</span><span class="mord mathit" style="margin-right:0.13889em;">T</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mclose">?</span></span></span></span>StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@A TL@@XZ)', verwiesen in Funktion '&quot;public: __thiscall CBaseClass::CBaseClass(void)&quot; (??0CBaseClass@@QAE@XZ)'</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265324/c-verberung-warum-krieg-ich-hier-einen-linker-fehler</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 07:46:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265324.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Apr 2010 11:23:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:23:19 GMT]]></title><description><![CDATA[<pre><code>class CBaseClass
{
public :

   CBaseClass ()
   {
      GetStr ();
   }

   virtual CString GetStr ();
};

class CSubClass : public CBaseClass
{
public :

   CString GetStr ()
   {
      return &quot;&quot;;
   }
};
</code></pre>
<p>SrvFileExport error LNK2019: Nicht aufgelöstes externes Symbol '&quot;public: virtual class ATL::CStringT&lt;char,class ATL::StrTraitATL&lt;char,class ATL::ChTraitsCRT&lt;char&gt; &gt; &gt; __thiscall CBaseClass::GetStr(void)&quot; (?GetStr@CBaseClass@@UAE?AV?<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>S</mi><mi>t</mi><mi>r</mi><mi>i</mi><mi>n</mi><mi>g</mi><mi>T</mi><mi mathvariant="normal">@</mi><mi>D</mi><mi>V</mi><mo>?</mo></mrow><annotation encoding="application/x-tex">CStringT@DV?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.07153em;">C</span><span class="mord mathit" style="margin-right:0.05764em;">S</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">i</span><span class="mord mathit">n</span><span class="mord mathit" style="margin-right:0.03588em;">g</span><span class="mord mathit" style="margin-right:0.13889em;">T</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mclose">?</span></span></span></span>StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@A TL@@XZ)', verwiesen in Funktion '&quot;public: __thiscall CBaseClass::CBaseClass(void)&quot; (??0CBaseClass@@QAE@XZ)'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886129</guid><dc:creator><![CDATA[Sieben]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:26:57 GMT]]></title><description><![CDATA[<p>Weil zum Erstellen deiner vtable die Adresse der Funktion der jeweiligen Klasse bekannt sein muss, und die gibt es nur mit Implementierung. Das gilt auch für die Basisklasse!<br />
Also entweder CBaseClass::GetStr() definieren, oder CBaseClass::GetStr() pure virtuaL machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886131</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:31:55 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Weil zum Erstellen deiner vtable die Adresse der Funktion der jeweiligen Klasse bekannt sein muss, und die gibt es nur mit Implementierung. Das gilt auch für die Basisklasse!<br />
Also entweder CBaseClass::GetStr() definieren, oder CBaseClass::GetStr() pure virtuaL machen.</p>
</blockquote>
<p>Das heißt so??</p>
<p>virtual CString GetStr () = 0;</p>
<pre><code>class CBaseClass
{
public :

   CBaseClass ()
   {
      GetStr ();
   }

   virtual CString GetStr () = 0;
};

class CSubClass : public CBaseClass
{
public :

   CString GetStr ()
   {
      return &quot;&quot;;
   }
};
</code></pre>
<p>Da bekomme ich weiterhin einen linker Fehler <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1886133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886133</guid><dc:creator><![CDATA[Sieben]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:31:55 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:35:39 GMT]]></title><description><![CDATA[<p>Ich habe es gerade durch den GCC laufen lassen und der macht keinen Linkerfehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886134</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:35:39 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:39:31 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich habe es gerade durch den GCC laufen lassen und der macht keinen Linkerfehler.</p>
</blockquote>
<p>Hm... mist hab hier nen Visual Studio 2003 <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>Muss ich da eine bestimmte Projekteinstellung haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886138</guid><dc:creator><![CDATA[Sieben]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:39:33 GMT]]></title><description><![CDATA[<p>Man ruft auch keine virtuellen Methoden im Konstruktor auf!!! Grundregel, absolut niemals nicht!!!<br />
Sry für die vielen Ausrufezeichen...<br />
Google sollte da ausreichend Erklärungen liefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886139</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:41:10 GMT]]></title><description><![CDATA[<p>Im Konstruktor von CBaseClass wird CBaseClass::GetStr() aufgerufen (nicht etwa, wie Du vielleicht annimmst, CSubClass::GetStr()), für die es keine Implementierung gibt. Grund ist, dass das CSubClass-Objekt zu dem Zeitpunkt noch nicht vollständig initialisiert ist.</p>
<p>Methoden können übrigens rein virtuell sein und dennoch eine Implementierung besitzen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Die Compiler verhalten sich unterschiedlich: Während MSVC nach der nicht vorhandenen Implementierung sucht, erstellt GCC eine Dummy-Implementierung, die das Programm mit der Meldung &quot;pure virtual function called&quot; abbricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886142</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:46:34 GMT]]></title><description><![CDATA[<p>gcc-4.4.3 (eigentlich ja ld aus binutils-2.20.1) bricht bei folgendem Programm</p>
<pre><code class="language-cpp">struct Base {
    Base() {
        fun();
    }

    virtual void fun() =0;
};

struct Der : public Base {
    void fun() {
    }
};

int main() {
    Der d;
    Base *b = new Der;
}
</code></pre>
<p>mit diesem Fehler ab</p>
<pre><code>virt_fun_in_constr.cpp: In constructor »Base::Base()«:
virt_fun_in_constr.cpp:4: Warnung: abstract virtual »virtual void Base::fun()« called from constructor
/tmp/ccAz8GqY.o: In function `Base::Base()':
virt_fun_in_constr.cpp:(.text._ZN4BaseC2Ev[Base::Base()]+0x1f): undefined reference to `Base::fun()'
collect2: ld gab 1 als Ende-Status zurück
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1886148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886148</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:48:54 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Die Compiler verhalten sich unterschiedlich: Während MSVC nach der nicht vorhandenen Implementierung sucht, erstellt GCC eine Dummy-Implementierung, die das Programm mit der Meldung &quot;pure virtual function called&quot; abbricht.</p>
</blockquote>
<p>Nichtmal das.<br />
Er sagt auch &quot;undefined reference to CBaseClass::GetStr()&quot;. Ich habe vergessen, in der main so ein Objekt anzulegen.</p>
<p>Aber mit meinen Debug-Einstellungen kommt was recht feines.</p>
<pre><code>D:\...\main.cpp||In constructor 'CBaseClass::CBaseClass()':|
D:\...\main.cpp|11|warning: abstract virtual 'virtual std::string CBaseClass::GetStr()' called from constructor|
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1886150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886150</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:50:00 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Im Konstruktor von CBaseClass wird CBaseClass::GetStr() aufgerufen (nicht etwa, wie Du vielleicht annimmst, CSubClass::GetStr()), für die es keine Implementierung gibt. Grund ist, dass das CSubClass-Objekt zu dem Zeitpunkt noch nicht vollständig initialisiert ist.</p>
<p>Methoden können übrigens rein virtuell sein und dennoch eine Implementierung besitzen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Die Compiler verhalten sich unterschiedlich: Während MSVC nach der nicht vorhandenen Implementierung sucht, erstellt GCC eine Dummy-Implementierung, die das Programm mit der Meldung &quot;pure virtual function called&quot; abbricht.</p>
</blockquote>
<p>Ok danke für die Erklärungen. <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="🙂"
    /><br />
Ich find das n bissi doof, aber wenn das c++ so macht is es ok <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 komm von C# und da geht so etwas:</p>
<pre><code>public abstract class BaseClass
{
   public BaseClass ()
   {
      GetStr ();
   }

   public abstract String GetStr ();
}

public class SubClass : BaseClass
{
   public override String GetStr ()
   {
      return &quot;&quot;;
   }
}
</code></pre>
<p>Der ruft dann tatsächlich die GetStr () von SubClass auf.</p>
<p>Hatte Gedacht, da sich die Sprachen ähneln kann c++ so etwas auch.</p>
<p>Der Grund weswegen ich frag, die Basisklasse hat Member für Parameter die jede Abgeleitete Klasse selber festlegt. Damit die nicht vergessen werden zu initialiseren dacht ich, ich ruf die Methode im Kontruktor auf.</p>
<p>Ich müsste es also so machen??</p>
<pre><code>class CBaseClass
{
public :

   int m_Parameter1;
   int m_Parameter2;
   int m_Parameter3;

   CBaseClass ()
   {
      //Init (); // Geht nicht
   }

   virtual void Init () = 0;
};

class CSubClass : public CBaseClass
{
public :

   void Init ()
   {
      m_Parameter1 = 1;
      m_Parameter2 = 2;
      m_Parameter3 = 3;
   }
};

CSubClass SubClass;

SubClass.Init ();
</code></pre>
<p>Wenn jemand vergisst die Init aufzurfen dann klapperts <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1886151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886151</guid><dc:creator><![CDATA[Sieben]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 11:57:43 GMT]]></title><description><![CDATA[<p>In dem Fall macht man Konstruktor private und bietet eine statische factory-Methode an, die dann gefahrlos ein Objekt erstellen und danach die init()-Methode aufrufen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886161</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 21 Apr 2010 11:57:43 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 12:02:28 GMT]]></title><description><![CDATA[<p>Dafür sind doch Konstruktoren und Initialisierungslisten da...</p>
<pre><code class="language-cpp">class base
{
protected:
   int m_Parameter1;
   int m_Parameter2;
   int m_Parameter3;

   explicit base(int p1=0, int p2=0, int p3=0)
   : m_Parameter1(p1)
   , m_Parameter2(p2)
   , m_Parameter3(p3) {}

public :
   virtual std::string getstr() const = 0;
};

class derived : public base
{
public :
   derived() : base(1,2,3) {}
   std::string getstr() const; // muss noch definiert werden
};

:

derived d;
</code></pre>
<p>Achte auch darauf, dass die Definitionen von &quot;Funktionen&quot; innerhalb von Klassen <em>inline</em> impliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886170</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 21 Apr 2010 12:02:28 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 12:15:20 GMT]]></title><description><![CDATA[<p>Die Initialisierungslisten kenn ich schon, ist aber für meinen Fall nicht so gut.<br />
Eine Factory-Methode das klingt super <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>Vielen Dank an alle die geholfen haben <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/1886182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886182</guid><dc:creator><![CDATA[Sieben]]></dc:creator><pubDate>Wed, 21 Apr 2010 12:15:20 GMT</pubDate></item><item><title><![CDATA[Reply to c++, Verberung, warum krieg ich hier einen linker Fehler? on Wed, 21 Apr 2010 13:57:22 GMT]]></title><description><![CDATA[<p>Sieben schrieb:</p>
<blockquote>
<p>Die Initialisierungslisten kenn ich schon, ist aber für meinen Fall nicht so gut.</p>
</blockquote>
<p>Warum nicht? Du solltest sie Zuweisungen im Konstruktorrumpf oder gar in manuell aufzurufenden <code>Init()</code> -Funktionen vorziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886254</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 21 Apr 2010 13:57:22 GMT</pubDate></item></channel></rss>