<?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[Vector mit verschiedenen Datentypen?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe benötige eine Liste, in welche ich drei verschiedene Datentypen speichern muss. In Java hätte ich die drei Datentypen in drei Klassen gekapselt, unter einer Mutterklasse vereint und einen Vector über die Mutterklasse erzeugt.</p>
<p>Laut meinem fantastischen C++ Buch ist dies aber unter C++ nicht möglich, weil man zwar einem Objekt der Subklasse ein Objekt der Mutterklasse zuweisen kann, aber nicht umgekehrt, ohne einen Informationsverlust (nämlich genau die gekapselten eigentlichen Daten) zu erleiden...</p>
<p>Ich hab mir daraufhin eine Lösung mit Pointern gebaut, in der ich die Daten in einer einzelnen Klasse kapsele, welche die Daten in einem void-Pointer und den Typen explizit speichert. Diese Klasse verwende ich zur Konstruktion meines Vektors.</p>
<p>Dieser Ansatz scheint aber nicht zu funktionieren, denn ich bekomme ohne dass ich es nachvollziehen kann, nachdem ich zwei Daten in der Liste gespeichert habe, die Fehlermeldung:</p>
<blockquote>
<p>glibc detected [...] corrupted double-linked list</p>
</blockquote>
<p>Selbst beim Debuggen kann ich nicht genau nachvollziehn, wo und warum das passiert, es scheint aber in einer der STL-Units zu passieren. Da ich aber davon ausgehe, dass die STL relativ sauber programmiert ist, vermute ich, dass der Fehler irgendwo in meiner Klasse liegt, vllt sollte ich einen Copy-Konstruktor definieren oder sowas?</p>
<p>Hier ein Auszug der Headerdatei, in welcher ich die Klasse definiert hab:</p>
<pre><code class="language-cpp">class Param {
    enum Params {
        DATE,
        TEXT,
        NUMBER,
        INVALID
    };

    Params type;
    void *data;

public:
        inline Param(): type(INVALID), data(NULL) { };

        inline Param(const boost::gregorian::date &amp;d): type(DATE), data(new boost::gregorian::date) {
            *(static_cast&lt;boost::gregorian::date*&gt;(data)) = d;
        };
        inline Param(const std::string &amp;s): type(TEXT), data(new std::string) {
            *(static_cast&lt;std::string*&gt;(data)) = s;
        };
        inline Param(const int &amp;i): type(NUMBER), data(new int) {
            *(static_cast&lt;int*&gt;(data)) = i;
        };

        inline boost::gregorian::date date() const {
            if (type == DATE)
                return *(static_cast&lt;boost::gregorian::date*&gt;(data));
            else
                return boost::gregorian::date();
        };

        inline std::string text() const {
            if (type == TEXT)
                return *(static_cast&lt;std::string*&gt;(data));
            else
                return std::string(&quot;&quot;);
        };

        inline int number() const {
            if (type == NUMBER)
                return *(static_cast&lt;int*&gt;(data));
            else
                return 0;
        };

        inline bool isDate() const { return type == DATE; };
        inline bool isText() const { return type == TEXT; };
        inline bool isNumber() const { return type == NUMBER; };

        inline ~Param() {
            if (type == DATE)
                delete static_cast&lt;boost::gregorian::date*&gt;(data);
            else if (type == TEXT)
                delete static_cast&lt;std::string*&gt;(data);
            else if (type == NUMBER)
                delete static_cast&lt;int*&gt;(data);
        };

};
</code></pre>
<p>Sieht jemand nen Fehler oder hat ne Idee, wie man das ganze besser lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191433/vector-mit-verschiedenen-datentypen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 26 Sep 2026 00:31:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191433.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Sep 2007 09:27:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:27:05 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe benötige eine Liste, in welche ich drei verschiedene Datentypen speichern muss. In Java hätte ich die drei Datentypen in drei Klassen gekapselt, unter einer Mutterklasse vereint und einen Vector über die Mutterklasse erzeugt.</p>
<p>Laut meinem fantastischen C++ Buch ist dies aber unter C++ nicht möglich, weil man zwar einem Objekt der Subklasse ein Objekt der Mutterklasse zuweisen kann, aber nicht umgekehrt, ohne einen Informationsverlust (nämlich genau die gekapselten eigentlichen Daten) zu erleiden...</p>
<p>Ich hab mir daraufhin eine Lösung mit Pointern gebaut, in der ich die Daten in einer einzelnen Klasse kapsele, welche die Daten in einem void-Pointer und den Typen explizit speichert. Diese Klasse verwende ich zur Konstruktion meines Vektors.</p>
<p>Dieser Ansatz scheint aber nicht zu funktionieren, denn ich bekomme ohne dass ich es nachvollziehen kann, nachdem ich zwei Daten in der Liste gespeichert habe, die Fehlermeldung:</p>
<blockquote>
<p>glibc detected [...] corrupted double-linked list</p>
</blockquote>
<p>Selbst beim Debuggen kann ich nicht genau nachvollziehn, wo und warum das passiert, es scheint aber in einer der STL-Units zu passieren. Da ich aber davon ausgehe, dass die STL relativ sauber programmiert ist, vermute ich, dass der Fehler irgendwo in meiner Klasse liegt, vllt sollte ich einen Copy-Konstruktor definieren oder sowas?</p>
<p>Hier ein Auszug der Headerdatei, in welcher ich die Klasse definiert hab:</p>
<pre><code class="language-cpp">class Param {
    enum Params {
        DATE,
        TEXT,
        NUMBER,
        INVALID
    };

    Params type;
    void *data;

public:
        inline Param(): type(INVALID), data(NULL) { };

        inline Param(const boost::gregorian::date &amp;d): type(DATE), data(new boost::gregorian::date) {
            *(static_cast&lt;boost::gregorian::date*&gt;(data)) = d;
        };
        inline Param(const std::string &amp;s): type(TEXT), data(new std::string) {
            *(static_cast&lt;std::string*&gt;(data)) = s;
        };
        inline Param(const int &amp;i): type(NUMBER), data(new int) {
            *(static_cast&lt;int*&gt;(data)) = i;
        };

        inline boost::gregorian::date date() const {
            if (type == DATE)
                return *(static_cast&lt;boost::gregorian::date*&gt;(data));
            else
                return boost::gregorian::date();
        };

        inline std::string text() const {
            if (type == TEXT)
                return *(static_cast&lt;std::string*&gt;(data));
            else
                return std::string(&quot;&quot;);
        };

        inline int number() const {
            if (type == NUMBER)
                return *(static_cast&lt;int*&gt;(data));
            else
                return 0;
        };

        inline bool isDate() const { return type == DATE; };
        inline bool isText() const { return type == TEXT; };
        inline bool isNumber() const { return type == NUMBER; };

        inline ~Param() {
            if (type == DATE)
                delete static_cast&lt;boost::gregorian::date*&gt;(data);
            else if (type == TEXT)
                delete static_cast&lt;std::string*&gt;(data);
            else if (type == NUMBER)
                delete static_cast&lt;int*&gt;(data);
        };

};
</code></pre>
<p>Sieht jemand nen Fehler oder hat ne Idee, wie man das ganze besser lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357685</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:34:07 GMT]]></title><description><![CDATA[<p>Du arbeitest mit dynamischen Daten - da brauchst du nicht nur einen Destruktor, sondern auch Copy-Ctor und operator=, sonst fliegt dir das Programm um die Ohren (list&lt;&gt;::insert() legt eine Kopie des übergebenen Wertes an, die irgendwann wieder gelöscht wird - das Default-Verhalten von C++ ist eine flache Kopie, wodurch beim Zerstören der temporären Variablen dein Speicher demontiert wird).</p>
<p>PS: Warum selber schreiben? Schau mal nach Boost::any.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357694</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:37:13 GMT]]></title><description><![CDATA[<p>Sowas habe ich vermutet, ich war mir nur nicht sicher, welche Konstruktoren und Operatoren ich noch implementieren sollte...</p>
<p>boost::any? *google*</p>
<p>thx btw</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357696</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:42:43 GMT]]></title><description><![CDATA[<p>noNeed 4 aNick schrieb:</p>
<blockquote>
<p>Sowas habe ich vermutet, ich war mir nur nicht sicher, welche Konstruktoren und Operatoren ich noch implementieren sollte...</p>
</blockquote>
<p>Dann schreib dir die &quot;Rule of Three&quot; ganz fett ins Notizbuch: &quot;Wer einen der 'großen Drei' (Kopier-Konstruktor, Zuweisungsoperator, Destruktor) benötigt, braucht in der Regel alle drei.&quot; (es gibt einige Ausnahmen von dieser Regel, aber nicht sehr viele)</p>
<blockquote>
<p>boost::any? *google*</p>
</blockquote>
<p>Du verwendest doch schon Boost, da mußt du dich nur etwas genauer umsehen (Boost::any ist afaik eine C++ Alternative zu unions).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357706</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:42:43 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:44:18 GMT]]></title><description><![CDATA[<p>Dein Java-Beispiel funktioniert deshalb nicht, weil es in Java keine Zeiger gibt. Die &quot;Objekte&quot;, die du in Java in dem vector speicherst, sind sowas wie Zeiger in C++. Und genauso kannst du das in C++ auch machen: Schreibe eine Oberklasse, sowei abgeleitete Klassen, die deine Daten kapseln. Dann speicherst du in deinem Vector Zeiger auf diese Oberklasse. An die eigentlichen Daten kommst du dann durch Polymorphie und evtl. explizites Downcasting ran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357707</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:46:49 GMT]]></title><description><![CDATA[<p>Alles klar.</p>
<p>Ich wollt auch nur kurz die Boost-Docs überfliegen, die liegen zwar auch lokal irgendwo, aber mit google bin ich halt schneller <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/1357710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357710</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:50:04 GMT]]></title><description><![CDATA[<p>Das sieht alles sehr unschön aus, wegen der ganzen Casterei, und das ist dann auch wegen dem void* nicht mehr typensicher!<br />
Hier würde sich der Einsatz von Templates anbieten.</p>
<pre><code class="language-cpp">#include &lt;cassert&gt;
#include &lt;vector&gt;
#include &lt;string&gt;

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

template&lt;typename T&gt;
class ValueImpl : public ValueImplBase
{
public:
	ValueImpl(const T&amp; object)
		: object_(object)
	{
	}

	ValueImplBase* clone() const
	{
		return new ValueImpl&lt;T&gt;(object_);
	}

	T&amp; value()
	{
		return object_;
	}

private:
	T object_;
};

class Value
{
public:
	template&lt;typename T&gt;
	Value(const T&amp; object)
		: p_impl_(new ValueImpl&lt;T&gt;(object))
	{
	}

	Value(const Value&amp; value)
		: p_impl_(0)
	{
		*this = value;
	}

	~Value()
	{
		delete p_impl_;
	}

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

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

private:
	ValueImplBase* p_impl_;
};

void test()
{
	std::vector&lt;Value&gt; myVector;

	myVector.push_back(Value(42));
	myVector.push_back(Value(std::string(&quot;Ich bin ein String!&quot;)));
	myVector.push_back(Value(42.0));

	Value&amp; v0 = myVector[0];
	v0.value&lt;int&gt;() += 2;

	Value&amp; v1 = myVector[1];
	v1.value&lt;std::string&gt;() += &quot; Jetzt wird mir auch noch was angehängt!&quot;;

	Value&amp; v2 = myVector[2];
	v2.value&lt;double&gt;() /= 2.0;

	// !!! Das führt zu einem Fehler, da v0 int enthält und nicht short !!!
	v0.value&lt;short&gt;()++;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1357712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357712</guid><dc:creator><![CDATA[Horst Baldowin III Jr.]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:54:36 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Dein Java-Beispiel funktioniert deshalb nicht, weil es in Java keine Zeiger gibt. Die &quot;Objekte&quot;, die du in Java in dem vector speicherst, sind sowas wie Zeiger in C++. Und genauso kannst du das in C++ auch machen: Schreibe eine Oberklasse, sowei abgeleitete Klassen, die deine Daten kapseln. Dann speicherst du in deinem Vector Zeiger auf diese Oberklasse. An die eigentlichen Daten kommst du dann durch Polymorphie und evtl. explizites Downcasting ran.</p>
</blockquote>
<p>Ja, das hatte ich auch schon überlegt. Schließlich löst Java das intern mehr oder weniger auch so, dass es nur Referenzen auf Objekte hält...</p>
<p>Hab nun eben noch den CpyCtr und den =Op geschrieben, nun klappts wunderbar.<br />
Wenn ich das nächste mal so eine Konstruktion benötige, werd ich aber wohl einfach boost::any benutzen - es reicht, wenn ich einmal das Rad neuerfunden hab <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/1357715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357715</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 09:55:44 GMT]]></title><description><![CDATA[<p>Du kannst auch meine &quot;tolle&quot; Lösung nehmen, die ich vorhin extra für dich geschrieben habe, weil mir so langweilig ist ... <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/1357716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357716</guid><dc:creator><![CDATA[Horst Baldowin III Jr.]]></dc:creator><pubDate>Mon, 03 Sep 2007 09:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 10:00:10 GMT]]></title><description><![CDATA[<p>Warte, hier haste nen Keks <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>
<p>Zugegeben, die ist auch hübsch geworden... Wie isn das mit der Typensicherheit bei mir? Ist das nicht durch die entsprechenden Abfragen sowieso gegeben?</p>
<p>Naja, ich mach jetzt erstmal mittach <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/1357718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357718</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Mon, 03 Sep 2007 10:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 11:56:50 GMT]]></title><description><![CDATA[<p>Ja, bei dir wird so nix schiefgehen, aber wenn du irgendwo nach void* castest, gehen die Typinformationen verloren. So könntest du einen Apfel nach void* casten und dann das void* nach Birne casten, und du hättest aus dem Apfel eine Birne gemacht - wohlgemerkt eine korrupte, kaputte (verfaulte) Birne, die du direkt wegschmeißen kannst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357813</guid><dc:creator><![CDATA[Horst Baldowin III Jr.]]></dc:creator><pubDate>Mon, 03 Sep 2007 11:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vector mit verschiedenen Datentypen? on Mon, 03 Sep 2007 12:03:40 GMT]]></title><description><![CDATA[<p>Unter typsicherheit wird normalerweise auch die im COmpiler eingebaute Typsicherheit verstanden und keine selbstgebaute. Natuerlich kann man sich einfach eine handvoll Byte leeren Speicher reservieren und sich auf irgendeine Art merken, dass das was drinsteht als int zu behandeln ist - sich einen int zu reservieren ist aber trotzdem sicherer und einfacher <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/1357820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357820</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Sep 2007 12:03:40 GMT</pubDate></item></channel></rss>