<?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[Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe eine kurze design-technische frage. und zwar habe ich zwei klassen, welche einfache datentypen kapseln,</p>
<pre><code class="language-cpp">class intVal {
public:
  unsigned int getValue() const { return value; }
  void setValue(unsigned int val) { value = val; }
private:
  unsigned int value;
};

class boolVal {
public:
  bool getValue() const { return value; }
  void setValue(bool val) { value = val; }
private:
  bool value;
};
</code></pre>
<p>zur laufzeit soll entschieden werden, welches konkrete objekt erzeugt wird, dh. ich bräcuhte eine gemeinsame basisklasse, um auf die methoden zuzugreifen:</p>
<pre><code class="language-cpp">Base* pBase = new intVal(); // bzw. pBase = new boolVal();
pBase-&gt;setValue(1234);      // bzw. pBase-&gt;setValue(true);
</code></pre>
<p>hat jemand eine idee, wie ich das problem lösen könnte?<br />
mit templates funzt es ja leider nicht, weil ich dann die basisklasse als template ausführen müsste und dann bei der deklaration des zeigers auf die basisklasse bereits einen typ angeben muss - was ich ja zu diesem zeitpunkt noch nicht weiß.<br />
ich hätte schon an das visitor-designpattern gedacht, aber da fällt mir keine passende lösung damit ein..</p>
<p>danke, MrGentleman</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191868/gemeinsame-basisklasse-für-methoden-mit-unterschiedlicher-signatur</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 07:45:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191868.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Sep 2007 13:10:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 13:10:25 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe eine kurze design-technische frage. und zwar habe ich zwei klassen, welche einfache datentypen kapseln,</p>
<pre><code class="language-cpp">class intVal {
public:
  unsigned int getValue() const { return value; }
  void setValue(unsigned int val) { value = val; }
private:
  unsigned int value;
};

class boolVal {
public:
  bool getValue() const { return value; }
  void setValue(bool val) { value = val; }
private:
  bool value;
};
</code></pre>
<p>zur laufzeit soll entschieden werden, welches konkrete objekt erzeugt wird, dh. ich bräcuhte eine gemeinsame basisklasse, um auf die methoden zuzugreifen:</p>
<pre><code class="language-cpp">Base* pBase = new intVal(); // bzw. pBase = new boolVal();
pBase-&gt;setValue(1234);      // bzw. pBase-&gt;setValue(true);
</code></pre>
<p>hat jemand eine idee, wie ich das problem lösen könnte?<br />
mit templates funzt es ja leider nicht, weil ich dann die basisklasse als template ausführen müsste und dann bei der deklaration des zeigers auf die basisklasse bereits einen typ angeben muss - was ich ja zu diesem zeitpunkt noch nicht weiß.<br />
ich hätte schon an das visitor-designpattern gedacht, aber da fällt mir keine passende lösung damit ein..</p>
<p>danke, MrGentleman</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360809</guid><dc:creator><![CDATA[MrGentleman]]></dc:creator><pubDate>Fri, 07 Sep 2007 13:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 13:24:13 GMT]]></title><description><![CDATA[<p>und wie wäre es mit dem Factory-Pattern?<br />
In c# gibt es für sowas interfaces...oder eben eine virtuelle &quot;basisklasse&quot; mit virtuellem dtor und leitest die beiden davon ab!</p>
<p>Ka mir fällt sonst nix andres wirklich ein!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360820</guid><dc:creator><![CDATA[ser1al_ausgeloggt]]></dc:creator><pubDate>Fri, 07 Sep 2007 13:24:13 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 13:53:22 GMT]]></title><description><![CDATA[<p>hmm...<br />
aber das problem ist doch weiterhin, dass ich auch wenn über ne factory mir die objekte boolVal bzw. intVal generiere, der zugriff über ne gemeinsame schnittstelle erfolgen muss - oder habe ich da irgend einen denkfehler ???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360836</guid><dc:creator><![CDATA[MrGentleman]]></dc:creator><pubDate>Fri, 07 Sep 2007 13:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 14:03:33 GMT]]></title><description><![CDATA[<p>Das Thema wurde hier vor kurzem schon mal diskutiert...<br />
Die sauberste Lösung dafür wäre in dem Fall wohl ein Weg über die RTTI:</p>
<pre><code class="language-cpp">boolVal *pBool;
intVal  *pInt;

if(pBool = dynamic_cast&lt;boolVal*&gt;(pBase))
{
   pBool-&gt;setBoolVal(true);
}
if(pInt = dynamic_cast&lt;intVal*&gt;(pBase))
{
   pInt-&gt;setIntVal(1234);
}
</code></pre>
<p>Das widerspricht zwar den Prinzipien der objektorientierten Programmierung, aber lässt sich manchmal eben nicht vermeiden...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360840</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Fri, 07 Sep 2007 14:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 14:09:35 GMT]]></title><description><![CDATA[<p>ok...den dynamic-cast wollte ich eigentlich irgendwie vermeiden wenns möglich wäre...aber naja...hilft halt nichts <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>herzlichen dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360847</guid><dc:creator><![CDATA[MrGentleman]]></dc:creator><pubDate>Fri, 07 Sep 2007 14:09:35 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 14:25:07 GMT]]></title><description><![CDATA[<p>Ich habe da mal ein Progrämmchen für dich geschrieben <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 />
Es benutzt zwar auch dynamic_cast, aber was soll's.<br />
Unten siehst du dann auch, wie man die Value-Klasse verwenden kann.</p>
<pre><code class="language-cpp">#include &lt;cassert&gt;

class ValueImpl
{
public:
	virtual ~ValueImpl() { }
	virtual ValueImpl* clone() const = 0;
};

template&lt;typename T&gt;
class ConcreteValue : public ValueImpl
{
public:
	ConcreteValue(const T&amp; value)
		: value_(value)
	{
	}

	ConcreteValue* clone() const
	{
		return new ConcreteValue(value_);
	}

	const T&amp; get() const
	{
		return value_;
	}

	void set(const T&amp; value)
	{
		value_ = value;
	}

private:
	T value_;
};

class Value
{
public:
	Value(const Value&amp; value)
		: p_impl_(value.p_impl_-&gt;clone())
	{
	}

	template&lt;typename T&gt;
	explicit Value(const T&amp; value)
		: p_impl_(new ConcreteValue&lt;T&gt;(value))
	{
	}

	~Value()
	{
		delete p_impl_;
	}

	template&lt;typename T&gt;
	const T&amp; get() const
	{
		ConcreteValue&lt;T&gt;* p_casted = dynamic_cast&lt;ConcreteValue&lt;T&gt;*&gt;(p_impl_);
		assert(p_casted);
		return p_casted-&gt;get();
	}

	template&lt;typename T&gt;
	void set(const T&amp; value)
	{
		ConcreteValue&lt;T&gt;* p_casted = dynamic_cast&lt;ConcreteValue&lt;T&gt;*&gt;(p_impl_);
		assert(p_casted);
		p_casted-&gt;set(value);
	}

	Value&amp; operator =(const Value&amp; rhs)
	{
		delete p_impl_;
		p_impl_ = rhs.p_impl_-&gt;clone();
		return *this;
	}

private:
	ValueImpl* p_impl_;
};

int main()
{
	Value a(5);
	Value b(42.0f);

	// OK:
	int valueA = a.get&lt;int&gt;();
	a.set(100);
	float valueB = b.get&lt;float&gt;();
	b.set(200.0f);

	// FÜHRT ZU FEHLERN, WEIL TYP FALSCH IST:
	double x = a.get&lt;double&gt;();
	a.set(100.0);
	int y = b.get&lt;int&gt;();
	b.set(42);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1360850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360850</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Fri, 07 Sep 2007 14:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 14:46:05 GMT]]></title><description><![CDATA[<p>mann, mann, mann - du bist mein held <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>herzlichen dank für die implementierung - das schaut für meine zwecke sehr ideal aus!</p>
<p>herzlichen dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360874</guid><dc:creator><![CDATA[MrGentleman]]></dc:creator><pubDate>Fri, 07 Sep 2007 14:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 14:56:52 GMT]]></title><description><![CDATA[<p>Boost.Any <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1360887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360887</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Fri, 07 Sep 2007 14:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 14:59:00 GMT]]></title><description><![CDATA[<p>@ThomasRiker:</p>
<p>Wenn Du die Prüfung auf dynamische Debug-Asserts beschränkst kannst Du Dir noch das rumsuchen in der Vererbungshierarchie (jedenfalls im Releasemodus) sparen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
    const T&amp; get() const 
    { 
		assert(typeid(*p_impl_) == typeid(ConcreteValue&lt;T&gt;));
        ConcreteValue&lt;T&gt;* p_casted = static_cast&lt;ConcreteValue&lt;T&gt;*&gt;(p_impl_); 
        return p_casted-&gt;get(); 
    } 

    template&lt;typename T&gt; 
    void set(const T&amp; value) 
    { 
		assert(typeid(*p_impl_) == typeid(ConcreteValue&lt;T&gt;));
        ConcreteValue&lt;T&gt;* p_casted = static_cast&lt;ConcreteValue&lt;T&gt;*&gt;(p_impl_); 
        p_casted-&gt;set(value); 
    }
</code></pre>
<p>Gibt an den gleichen Stellen asserts im Debug-Modus und kracht an den gleichen Stellen im Release-Modus <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1360889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360889</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 07 Sep 2007 14:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 17:20:37 GMT]]></title><description><![CDATA[<p>Ja, stimmt <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="😉"
    /><br />
Am besten würde man wohl in jedem Fall eine Exception werfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360963</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Fri, 07 Sep 2007 17:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Gemeinsame Basisklasse für Methoden mit unterschiedlicher Signatur on Fri, 07 Sep 2007 22:01:15 GMT]]></title><description><![CDATA[<p>Oder man installiert sich endlich Boost um dieses endlose Boost-Nachprogrammieren zu stoppen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1361103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361103</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Fri, 07 Sep 2007 22:01:15 GMT</pubDate></item></channel></rss>