<?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[Framework-Design &#x2F; Virtuelle Klassen]]></title><description><![CDATA[<p>Folgende Aufgabenstellung: Es soll ein kleiners Datenbank-Framework mit Hilfe von abstrakten (also virtuellen) Klassen erstellt werden. Die virtuellen Klassen dürfen keinerlei Variablen beinhalten. Die abgeleiteten Klassen sollen eine unbekannte Anzahl Werte unterstützen.</p>
<p>Also in etwa so:</p>
<pre><code class="language-cpp">class Value
{
//Keine Variablen
public:
virtual (irgendein Typ) getValue(int ValueType);
virtual void setValue( int ValueType, (irgendeinTyp) Value);
};

class MyValue: public Value
{
//Irgendwelche Variablen
bool Boolean1;
bool Boolean2;

virtual (irgendein Typ) getValue(int ValueType);
virtual void setValue( int ValueType, (irgendeinTyp) Value);
};

//Bspw:
bool MyValue::getValue(int ValueType)
{

if(ValueType == 1)
{
return Boolean2;
}

return Boolean1;
}

class Database
{
...
std::vector&lt;boost::shared_ptr&lt;Value*&gt; &gt; WerteListe;

...
};
</code></pre>
<p>PS: MyValue ist kein Teil des Frameworks sondern soll nur zeigen wie man dann die abstrakte Klasse Value nutzen könnte.</p>
<p>Frage:<br />
Geht das nicht einfacher bzw. schöner? <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="😕"
    /><br />
So muss für jede Art einer Variable (bool, int, long usw.) eine eigene get/set-Methode erstellt werden. Ausserdem finde ich die Kombination von Vector und abgeleiteten Klassen ultra-hässlich! (Ohne shared_pointer ist es fast unmöglich an Memory Leaks vorbei zu kommen!).</p>
<p>Eine Möglichkeit wäre noch die Get-/Set-Methoden normal zu definieren (ohne virtual) so müsste man die Funktion überladen, solange sie nicht überladen ist geben sie einfach NULL bzw. false zurück. Ist aber auch nicht wirklich schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249009/framework-design-virtuelle-klassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 17:38:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249009.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Sep 2009 14:29:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 14:31:17 GMT]]></title><description><![CDATA[<p>Folgende Aufgabenstellung: Es soll ein kleiners Datenbank-Framework mit Hilfe von abstrakten (also virtuellen) Klassen erstellt werden. Die virtuellen Klassen dürfen keinerlei Variablen beinhalten. Die abgeleiteten Klassen sollen eine unbekannte Anzahl Werte unterstützen.</p>
<p>Also in etwa so:</p>
<pre><code class="language-cpp">class Value
{
//Keine Variablen
public:
virtual (irgendein Typ) getValue(int ValueType);
virtual void setValue( int ValueType, (irgendeinTyp) Value);
};

class MyValue: public Value
{
//Irgendwelche Variablen
bool Boolean1;
bool Boolean2;

virtual (irgendein Typ) getValue(int ValueType);
virtual void setValue( int ValueType, (irgendeinTyp) Value);
};

//Bspw:
bool MyValue::getValue(int ValueType)
{

if(ValueType == 1)
{
return Boolean2;
}

return Boolean1;
}

class Database
{
...
std::vector&lt;boost::shared_ptr&lt;Value*&gt; &gt; WerteListe;

...
};
</code></pre>
<p>PS: MyValue ist kein Teil des Frameworks sondern soll nur zeigen wie man dann die abstrakte Klasse Value nutzen könnte.</p>
<p>Frage:<br />
Geht das nicht einfacher bzw. schöner? <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="😕"
    /><br />
So muss für jede Art einer Variable (bool, int, long usw.) eine eigene get/set-Methode erstellt werden. Ausserdem finde ich die Kombination von Vector und abgeleiteten Klassen ultra-hässlich! (Ohne shared_pointer ist es fast unmöglich an Memory Leaks vorbei zu kommen!).</p>
<p>Eine Möglichkeit wäre noch die Get-/Set-Methoden normal zu definieren (ohne virtual) so müsste man die Funktion überladen, solange sie nicht überladen ist geben sie einfach NULL bzw. false zurück. Ist aber auch nicht wirklich schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770377</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Tue, 01 Sep 2009 14:31:17 GMT</pubDate></item><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 14:44:28 GMT]]></title><description><![CDATA[<p>Wie wäre es mit einem template?</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt;
class MyValue: public Value
{
//Irgendwelche Variablen
bool Boolean1;
bool Boolean2;

virtual U getValue(T ValueType);
virtual void setValue( T ValueType, U Value);
};
</code></pre>
<p>EDIT:<br />
Respektive müsstest du bei der Basisklasse dann die beiden Funktionen auch noch template Funktionen draus machen, wo du dann jeweils den gewünschten Typen angeben kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770385</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 01 Sep 2009 14:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 15:35:57 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Respektive müsstest du bei der Basisklasse dann die beiden Funktionen auch noch template Funktionen draus machen, wo du dann jeweils den gewünschten Typen angeben kannst.</p>
</blockquote>
<p>Allerdings sind Templatememberfunktionen aus gutem Grund niemals virtuell.</p>
<p>Mir scheint das kein geeigneter Fall für Vererbung zu sein, weil die Menge zulässiger Argumente von der Implementation der abgeleiteten Klassen abhängen würde.</p>
<p>Spontan fällt mir so etwas ein:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class TValue
{
    virtual T getValue(int ValueType) const = 0;
    virtual void setValue(int ValueType, const T&amp; Value) = 0;
    virtual ~TValue() {}
};

class Value
{
//Keine Variablen
public:
    template &lt;typename T&gt;
    T getValue(int ValueType) const
    {
        if ( const TValue&lt;T&gt;* p = dynamic_cast&lt;const TValue&lt;T&gt;*&gt;( this ) )
            return p-&gt;getValue( ValueType );
        throw /*up*/...;
    }
    template &lt;typename T&gt;
    void setValue(int ValueType, const T&amp; Value)
    {
        if ( TValue&lt;T&gt;* p = dynamic_cast&lt;TValue&lt;T&gt;*&gt;( this ) )
            return p-&gt;setValue( ValueType, Value );
        throw /*up*/...;
    }
    virtual ~Value() {}
};

class Irgendwas_mit_int_oder_double : public Value, public TValue&lt;int&gt;, public TValue&lt;double&gt;
{
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1770399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770399</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 01 Sep 2009 15:35:57 GMT</pubDate></item><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 16:13:52 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Respektive müsstest du bei der Basisklasse dann die beiden Funktionen auch noch template Funktionen draus machen, wo du dann jeweils den gewünschten Typen angeben kannst.</p>
</blockquote>
<p>Allerdings sind Templatememberfunktionen aus gutem Grund niemals virtuell.</p>
</blockquote>
<p>Hm. Ja. Ich dachte ich habe mal was ähnliches gemacht, dort hatte ich aber keine Polymorphie..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770421</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 01 Sep 2009 16:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 16:28:04 GMT]]></title><description><![CDATA[<p>Du koenntest auch die verschiedenen Typen wie double, char*, ... mittels union wrappen und ein Flag setzen. Ueber Methoden a la isDouble kannst du den tatsaechlichen Typ zur Laufzeit identifizieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770433</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 01 Sep 2009 16:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 17:25:58 GMT]]></title><description><![CDATA[<p>Rookie86 schrieb:</p>
<blockquote>
<p>Folgende Aufgabenstellung: Es soll ein kleiners Datenbank-Framework mit Hilfe von abstrakten (also virtuellen) Klassen erstellt werden. Die virtuellen Klassen dürfen keinerlei Variablen beinhalten.</p>
</blockquote>
<p>Gewöhn dir gleich mal ab selbst erfundene Begriffe wie &quot;virtuelle Klassen&quot; zu verwenden. Den gibt's nicht, und er macht keinen Sinn.</p>
<p>Was es noch gibt ist der Begriff Interface oder Interface-Klasse - der oft für Klassen verwendet wird die ausschliesslich (oder fast ausschliesslich) aus &quot;pure virtual&quot; Funktionen bestehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770460</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 Sep 2009 17:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to Framework-Design &#x2F; Virtuelle Klassen on Tue, 01 Sep 2009 18:12:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Du koenntest auch die verschiedenen Typen wie double, char*, ... mittels union wrappen und ein Flag setzen. Ueber Methoden a la isDouble kannst du den tatsaechlichen Typ zur Laufzeit identifizieren.</p>
</blockquote>
<p>Genau so etwas habe ich gesucht! <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/1770478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770478</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Tue, 01 Sep 2009 18:12:53 GMT</pubDate></item></channel></rss>