<?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[Code aus meinem Bcuh funktioniert nicht]]></title><description><![CDATA[<p>Warum geht der Code hier nicht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Shape
{
    public:
    Shape();
    virtual ~Shape();
    virtual long GetArea() const {return -1;}
    virtual long GetPerim() const {return -1;}
    virtual void Draw() const {};
};

Shape::Shape()
{

}

Shape::~Shape()
{

}

class Circle : public Shape
{
    public:
    Circle(int radius);
    ~Circle();
    long GetArea() const {return 3 * itsRadius * itsRadius;}
    long GetPerim() const {return 6 * itsRadius;}
    void Draw() const;

    private:
    int itsRadius;
    int itsCircumreference;
};

Circle::Circle(int radius)
:itsRadius(radius)
{

}

Circle::~Circle()
{

}

void Circle::Draw() const
{
    cout &lt;&lt; &quot;Routine zum Zeichnen eins Kreises\n&quot;;
}

class Rectangle
{
    public:
    Rectangle(int len,int width);
    virtual ~Rectangle();
    long GetArea() const {return itsLength * itsWidth;}
    long GetPerim() const {return 2*itsLength + 2*itsWidth;}
    int GetLength() const {return itsLength;}
    int GetWidth() const {return itsWidth;}
    void Draw() const;

    private:
    int itsLength;
    int itsWidth;

};

Rectangle::Rectangle(int len,int width)
:itsLength(len), itsWidth(width)
{

}

Rectangle::~Rectangle()
{

}

void Rectangle::Draw() const
{
    for (int i=0; i&lt;itsLength; i++)
    {
        for (int j=0; j&lt;itsWidth; j++)
        {
            cout &lt;&lt; &quot;X&quot;;
        }
        cout &lt;&lt; &quot;\n&quot;;
    }
}

class Square : public Rectangle
{
    public:
    Square(int len);
    Square(int len, int width);
    ~Square();
    long GetPerim() const {return 4 * GetLength();}
};

Square::Square(int len)
:Rectangle(len,len)
{

}

Square::Square(int len,int width)
:Rectangle(len,width)
{
    cout &lt;&lt; &quot;Fehler, kein Quadrat....ein Rechteck?\n&quot;;
}

int main()
{

    return 0;
}
</code></pre>
<p>Es kommt:</p>
<blockquote>
<p>Compiling: C:\MinGW\Andi\kapitel 18.cpp<br />
Linking console executable: C:\MinGW\Andi\kapitel 18.exe<br />
C:\MinGW\Andi\kapitel 18.o:kapitel 18.cpp:(.text+0x3d6): undefined reference to <code>vtable for Square' C:\\MinGW\\Andi\\kapitel 18.o:kapitel 18.cpp:(.text+0x400): undefined reference to</code>vtable for Square'<br />
C:\MinGW\Andi\kapitel 18.o:kapitel 18.cpp:(.text+0x42a): undefined reference to <code>vtable for Square' C:\\MinGW\\Andi\\kapitel 18.o:kapitel 18.cpp:(.text+0x454): undefined reference to</code>vtable for Square'<br />
collect2: ld returned 1 exit status<br />
Process terminated with status 1 (0 minutes, 1 seconds)<br />
0 errors, 0 warnings</p>
</blockquote>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192770/code-aus-meinem-bcuh-funktioniert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 16:19:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192770.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Sep 2007 13:55:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 13:55:31 GMT]]></title><description><![CDATA[<p>Warum geht der Code hier nicht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Shape
{
    public:
    Shape();
    virtual ~Shape();
    virtual long GetArea() const {return -1;}
    virtual long GetPerim() const {return -1;}
    virtual void Draw() const {};
};

Shape::Shape()
{

}

Shape::~Shape()
{

}

class Circle : public Shape
{
    public:
    Circle(int radius);
    ~Circle();
    long GetArea() const {return 3 * itsRadius * itsRadius;}
    long GetPerim() const {return 6 * itsRadius;}
    void Draw() const;

    private:
    int itsRadius;
    int itsCircumreference;
};

Circle::Circle(int radius)
:itsRadius(radius)
{

}

Circle::~Circle()
{

}

void Circle::Draw() const
{
    cout &lt;&lt; &quot;Routine zum Zeichnen eins Kreises\n&quot;;
}

class Rectangle
{
    public:
    Rectangle(int len,int width);
    virtual ~Rectangle();
    long GetArea() const {return itsLength * itsWidth;}
    long GetPerim() const {return 2*itsLength + 2*itsWidth;}
    int GetLength() const {return itsLength;}
    int GetWidth() const {return itsWidth;}
    void Draw() const;

    private:
    int itsLength;
    int itsWidth;

};

Rectangle::Rectangle(int len,int width)
:itsLength(len), itsWidth(width)
{

}

Rectangle::~Rectangle()
{

}

void Rectangle::Draw() const
{
    for (int i=0; i&lt;itsLength; i++)
    {
        for (int j=0; j&lt;itsWidth; j++)
        {
            cout &lt;&lt; &quot;X&quot;;
        }
        cout &lt;&lt; &quot;\n&quot;;
    }
}

class Square : public Rectangle
{
    public:
    Square(int len);
    Square(int len, int width);
    ~Square();
    long GetPerim() const {return 4 * GetLength();}
};

Square::Square(int len)
:Rectangle(len,len)
{

}

Square::Square(int len,int width)
:Rectangle(len,width)
{
    cout &lt;&lt; &quot;Fehler, kein Quadrat....ein Rechteck?\n&quot;;
}

int main()
{

    return 0;
}
</code></pre>
<p>Es kommt:</p>
<blockquote>
<p>Compiling: C:\MinGW\Andi\kapitel 18.cpp<br />
Linking console executable: C:\MinGW\Andi\kapitel 18.exe<br />
C:\MinGW\Andi\kapitel 18.o:kapitel 18.cpp:(.text+0x3d6): undefined reference to <code>vtable for Square' C:\\MinGW\\Andi\\kapitel 18.o:kapitel 18.cpp:(.text+0x400): undefined reference to</code>vtable for Square'<br />
C:\MinGW\Andi\kapitel 18.o:kapitel 18.cpp:(.text+0x42a): undefined reference to <code>vtable for Square' C:\\MinGW\\Andi\\kapitel 18.o:kapitel 18.cpp:(.text+0x454): undefined reference to</code>vtable for Square'<br />
collect2: ld returned 1 exit status<br />
Process terminated with status 1 (0 minutes, 1 seconds)<br />
0 errors, 0 warnings</p>
</blockquote>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367780</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Tue, 18 Sep 2007 13:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:00:38 GMT]]></title><description><![CDATA[<p>Du hast den Destruktor der Klasse Square nicht definiert. (daß der Linker sich nicht über den fehlenden Dtor beschwert, liegt an den Eigenheiten des Compilers - der packt die vtable in die Datei mit der ersten virtuellen non-inline Methode der Klasse)</p>
<p>Btw, ist es eigentlich Absicht, daß Rectangle <em>nicht</em> von Shape abgeleitet ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367783</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:19:19 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...daß der Linker sich nicht über den fehlenden Dtor beschwert, liegt an den Eigenheiten des Compilers - der packt die vtable in die Datei mit der ersten virtuellen non-inline Methode der Klasse...</p>
</blockquote>
<p>Ist aber schon eine selten dämliche Fehlermeldung, oder ?<br />
Ich habe auch ganz schön gesucht, bis ich das gefunden habe.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14886">@Stromberg</a>: Damit einem sowas nicht passiert, schreibe ich immer erstmal gerne &quot;triviale&quot; Funktionen inline - da sieht man schneller, was noch fehlt.<br />
Danach kann man einzelne Implementationen immer noch auslagern...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367800</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:21:52 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>...daß der Linker sich nicht über den fehlenden Dtor beschwert, liegt an den Eigenheiten des Compilers - der packt die vtable in die Datei mit der ersten virtuellen non-inline Methode der Klasse...</p>
</blockquote>
<p>Ist aber schon eine selten dämliche Fehlermeldung, oder ?<br />
Ich habe auch ganz schön gesucht, bis ich das gefunden habe.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
</blockquote>
<p>Schon möglich, aber damit muß man wohl leben (und ohne diese vtable geht's nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367806</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:21:52 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:47:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;

class shape
{
public:
	shape() {};
	virtual ~shape(){};

public:
    virtual double	get_area() const	= 0;
    virtual double	get_perimeter() const = 0;
	virtual void	draw(std::ostream&amp;) const = 0;
};

class circle : public shape
{
public:
	circle(double radius) : m_radius(radius) {}

	double			get_area() const		{	return (std::acos(-1.0) * m_radius * m_radius);	}
	double			get_perimeter() const	{	return (2 * std::acos(-1.0) * m_radius);		}
	void			draw(std::ostream&amp; out) const	{	out &lt;&lt; &quot;Kreis K(R: &quot; &lt;&lt; m_radius &lt;&lt; &quot;)&quot;;		}

private:
    double			m_radius;
};

class rectangle : public shape
{
public:
	rectangle(double a, double b) : m_a(a), m_b(b) {}

public:
	double			get_area() const		{	return (m_a * m_b);			}
	double			get_perimeter() const	{	return (2 * m_a + 2 * m_b);	}
	double			get_a() const			{	return m_a;					}
	double			get_b() const			{	return m_b;					}
	void			draw(std::ostream&amp; out) const
	{
		for(double a = 0; double a &lt; m_a; a += 1.0)
		{
			for (double b = 0; b &lt; m_b; b += 1.0)
				out &lt;&lt; (a == 0 || a == (m_a - 1) ? &quot;_&quot; : &quot;|&quot;);
			out &lt;&lt; std::endl;
		}
	}

private:
	double	m_a;
	double	m_b;
};

class square : public rectangle
{
public:
	square(double a) : rectangle(a, a) {}
};
</code></pre>
<p><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="🙂"
    /> So ist das doch schon hübsch <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1367809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367809</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:47:36 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:38:50 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...Schon möglich, aber damit muß man wohl leben (und ohne diese vtable geht's nicht).</p>
</blockquote>
<p>Mir leuchtet halt das Vorgehen des Compilers hier nicht ein. Wieso moniert er eine fehlende vtable an und warum fehlt sie, wenn die Implementation EINER Memberfunktion fehlt (was er ja als Letztes feststellt) ?</p>
<p>EDIT: AAAAAH - jetzt hab ich's verstanden !<br />
Der <em>Compiler</em> legt die vtable in dem Modul an, in dem er die erste nicht-inline-Implementierung findet ....<br />
Der <em>Linker</em> möchte die Implementierungen dort &quot;reinhängen&quot; - und dazu braucht er die vtable.</p>
<p>Was passiert eigentlich, wenn man dem Linker in mehreren Modulen eine vtable anbietet ? (wenn man die Implementierungen auf verschiedene cpp's verteilt, die man getrennt compiliert)<br />
Stellt er dann &quot;Identität&quot; fest und entscheidet sich einfach für eine ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367810</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:42:39 GMT]]></title><description><![CDATA[<p>Für die vtable gilt die ODR genauso wie für jedes andere Objekt und darum muß der Compiler einen Punkt finden, wo er sie definieren kann. Und das passiert dann normalerweise in der Übersetzungseinheit, in der die erste virtuelle Methode der Klasse untergebracht ist. Das heißt, wenn genau diese Methode nicht definiert wurde, fehlt (auch) die Definition der vtable.</p>
<p>(und für den Linker ist die vtable wichtiger als die nicht definierte Methode, deshalb beschwert er sich darüber, daß sie fehlt)</p>
<p>Edit:</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Was passiert eigentlich, wenn man dem Linker in mehreren Modulen eine vtable anbietet ? (wenn man die Implementierungen auf verschiedene cpp's verteilt, die man getrennt compiliert)<br />
Stellt er dann &quot;Identität&quot; fest und entscheidet sich einfach für eine ?</p>
</blockquote>
<p>Es gibt genau eine &quot;erste&quot; Methode - und wenn die doppelt vorkommt, wird der Linker sich darüber vermutlich auch beschweren. Kritisch wird es imho nur, wenn du mit expliziten inline-Angaben rumspielst - aber vermutlich endet das auch in Linkerfehlern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367815</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:42:39 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:48:30 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...Es gibt genau eine &quot;erste&quot; Methode - und wenn die doppelt vorkommt, wird der Linker sich darüber vermutlich auch beschweren. ..</p>
</blockquote>
<p>Mir schwebte Folgendes vor:</p>
<pre><code class="language-cpp">// MyFatClass.h
class MyFatClass {
// ... säckeweise Funktionsdeklarationen
};
</code></pre>
<pre><code class="language-cpp">// MyFatClass_impl1.cpp
#include &quot;MyFatClass.h&quot;

void MyFatClass::f1() { } // erste 
void MyFatClass::f2() { }
// ... säckeweise Funktionsdefinitionen
</code></pre>
<pre><code class="language-cpp">// MyFatClass_impl2.cpp
#include &quot;MyFatClass.h&quot;

void MyFatClass::f1001() { } // erste 
void MyFatClass::f1002() { }
// ... säckeweise Funktionsdefinitionen
</code></pre>
<p>Wenn ich nun die beiden cpps getrennt compiliere, stellt der Compiler für jede einmal &quot;eine erste&quot; fest und sollte in beiden objs eine vtable anlegen, die dann der Linker beide findet.<br />
Das ist doch kein sooo exotisches Szenario, dass es bereits die Standardvorgaben sprengt, oder ?</p>
<p>Meine Vorstellung ist eigentlich eher so eine &quot;Identitätsregel für ODR&quot; wie es sie auch bei templates gibt...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367821</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 14:54:48 GMT]]></title><description><![CDATA[<p>Nein, es geht nicht um die erste &quot;hier&quot; definierte Methode, sondern um die erste Methode in der Klassendeklaration - und die ist normalerweise überall die selbe.</p>
<p>Problematisch könnte nur folgendes werden:</p>
<pre><code class="language-cpp">//test.h
class test
{
  virtual void f1();//unter normalen Umständen ist das hier die erste Methode
  virtual void f2();
  virtual void f3();
  ...
};

//test1.cpp
#include &quot;test.h&quot;

inline void test::f1(){...}//wurde als inline deklariert, also ist f2 jetzt erste Methode

void test::f3(){...}

//test2.cpp
#include &quot;test.h&quot;
void test::f2(){...}
//hier weiß der Compiler nichts von dem obigen inline, also erwartet er die vtable in der test1.cpp
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1367825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367825</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Tue, 18 Sep 2007 15:16:14 GMT]]></title><description><![CDATA[<p>Ach so !!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Danke.</p>
<p>Zu Deinem Beispiel: Mein gcc wirft dann gar ein &quot;undefined symbol f1()&quot; raus...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367840</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 18 Sep 2007 15:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to Code aus meinem Bcuh funktioniert nicht on Wed, 19 Sep 2007 06:50:01 GMT]]></title><description><![CDATA[<p>Ja, das kann auch vorkommen - schließlich ist f1() außerhalb der test1.cpp nicht zu erreichen (inline funktioniert nur dann, wenn der Quellcode in jeder ÜE sichtbar ist, die ihn benötigt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1368175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1368175</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 19 Sep 2007 06:50:01 GMT</pubDate></item></channel></rss>