<?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[[Designfrage]OOP-Interpreter]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Seit geraumer zeit versuche ich ein für mich zufriedenstellende Klassenhirarchie für einen Interpreter zu erstellen.<br />
Was mir Schwierigkeit bereitet ist dabei die Implementierung des Typsystems, was vererbung unterstützen sollte.<br />
Habt ihr ein Paar Anregungen dazu?</p>
<p>Ich dachte ich nehme eine Baumstruktur um die Bezeichner/Eigenschafts beziehung abzubilden. Ein Objekt wäre dann eine ID die dann ein Objekt im Baum Representiert, und ein Typ lediglich eine &quot;Objekt-Schablone&quot; die bei instanzierung einfach kopiert wird...<br />
Naja das war meine erste Idee, aber da fehlen die vererbungsbeziehungen und es gibt kein Typsystem...</p>
<p>Was sind den die geläufigen Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298620/designfrage-oop-interpreter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 18:54:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298620.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Jan 2012 15:42:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Designfrage]OOP-Interpreter on Tue, 24 Jan 2012 15:42:27 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Seit geraumer zeit versuche ich ein für mich zufriedenstellende Klassenhirarchie für einen Interpreter zu erstellen.<br />
Was mir Schwierigkeit bereitet ist dabei die Implementierung des Typsystems, was vererbung unterstützen sollte.<br />
Habt ihr ein Paar Anregungen dazu?</p>
<p>Ich dachte ich nehme eine Baumstruktur um die Bezeichner/Eigenschafts beziehung abzubilden. Ein Objekt wäre dann eine ID die dann ein Objekt im Baum Representiert, und ein Typ lediglich eine &quot;Objekt-Schablone&quot; die bei instanzierung einfach kopiert wird...<br />
Naja das war meine erste Idee, aber da fehlen die vererbungsbeziehungen und es gibt kein Typsystem...</p>
<p>Was sind den die geläufigen Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171915</guid><dc:creator><![CDATA[InterPie]]></dc:creator><pubDate>Tue, 24 Jan 2012 15:42:27 GMT</pubDate></item><item><title><![CDATA[Reply to [Designfrage]OOP-Interpreter on Tue, 24 Jan 2012 18:00:08 GMT]]></title><description><![CDATA[<p>Was für ein Interpreter ist das? Kannst du dein Vorhaben genauer beschreiben? Hast du schon experimentiert?</p>
<p>Ohne die Antworten auf diese Fragen zu kennen ein kleiner Entwurf von mir. Was entspricht daran deinen Vorstellungen und was nicht?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;boost/any.hpp&gt;
#include &lt;boost/foreach.hpp&gt;

struct Type
{
	virtual ~Type()
	{
	}

	virtual size_t size() const = 0;
	virtual void constructDefault(void *dest) const = 0;
	virtual void construct(void *dest, const boost::any &amp;value) const = 0;
};

template &lt;class T&gt;
struct GenericType : Type
{
	virtual size_t size() const
	{
		return sizeof(T);
	}

	virtual void constructDefault(void *dest) const
	{
		new (dest) T();
	}

	virtual void construct(void *dest, const boost::any &amp;value) const
	{
		new (dest) T(boost::any_cast&lt;T&gt;(value));
	}
};

struct MemberVariable
{
	const Type *type;
	std::string name;
	boost::any defaultValue;

	MemberVariable(const Type &amp;type, std::string name, boost::any defaultValue = boost::any())
		: type(&amp;type)
		, name(name)
		, defaultValue(defaultValue)
	{
	}
};

struct Class
{
	std::vector&lt;MemberVariable&gt; members;

	virtual void construct(std::vector&lt;char&gt; &amp;memory) const
	{
		initializeMembers(memory);
	}

	virtual bool findMember(std::string name, size_t &amp;offset) const
	{
		BOOST_FOREACH (const MemberVariable &amp;mem, members)
		{
			if (mem.name == name)
			{
				return true;
			}

			offset += mem.type-&gt;size();
		}

		return false;
	}

private:

	void initializeMembers(std::vector&lt;char&gt; &amp;memory) const
	{
		BOOST_FOREACH (const MemberVariable &amp;mem, members)
		{
			size_t oldSize = memory.size();
			memory.resize(oldSize + mem.type-&gt;size());
			void *member = &amp;memory[0] + oldSize;
			if (mem.defaultValue.empty())
			{
				mem.type-&gt;constructDefault(member);
			}
			else
			{
				mem.type-&gt;construct(member, mem.defaultValue);
			}
		}
	}
};

struct DerivedClass : Class
{
	Class *parent;

	virtual void construct(std::vector&lt;char&gt; &amp;memory) const
	{
		parent-&gt;construct(memory);
		Class::construct(memory);
	}

	virtual bool findMember(std::string name, size_t &amp;offset) const
	{
		return
			parent-&gt;findMember(name, offset) ||
			Class::findMember(name, offset);
	}
};

struct Object
{
	const Class &amp;type;
	std::vector&lt;char&gt; elements;

	Object(const Class &amp;type)
		: type(type)
	{
		type.construct(elements);
	}
};

template &lt;class T&gt;
T *getElement(Object &amp;obj, std::string name)
{
	size_t offset = 0;
	if (!obj.type.findMember(name, offset))
		return 0;

	return reinterpret_cast&lt;T *&gt;(&amp;obj.elements[0] + offset);
}

int main()
{
	GenericType&lt;int&gt; integer;
	GenericType&lt;Object *&gt; pointer;

	Class a;
	a.members.push_back(MemberVariable(integer, &quot;count&quot;, boost::any(123)));

	DerivedClass b;
	b.parent = &amp;a;
	b.members.push_back(MemberVariable(pointer, &quot;other&quot;));

	Object instanceA(a);
	Object instanceB(b);

	using namespace std;

	cout &lt;&lt; *getElement&lt;int&gt;(instanceA, &quot;count&quot;) &lt;&lt; endl;
	cout &lt;&lt; *getElement&lt;int&gt;(instanceB, &quot;count&quot;) &lt;&lt; endl;
	cout &lt;&lt; *getElement&lt;Object *&gt;(instanceB, &quot;other&quot;) &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2171981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171981</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 24 Jan 2012 18:00:08 GMT</pubDate></item><item><title><![CDATA[Reply to [Designfrage]OOP-Interpreter on Tue, 24 Jan 2012 18:32:16 GMT]]></title><description><![CDATA[<p>InterPie schrieb:</p>
<blockquote>
<p>Was sind den die geläufigen Ideen?</p>
</blockquote>
<p>Machs simpel und repräsentiere jedes Objekt so:</p>
<pre><code class="language-cpp">struct object {
  std::map&lt;std::string, std::unique_ptr&lt;object&gt; &gt; member;
  std::map&lt;std::string, function&gt; methods;
};
</code></pre>
<p>Perl und Python machen das ähnlich.</p>
<p>Wenn A von B erbt, kopierst du einfach alle Daten und Funktionen von A nach B, sofern sie nicht von B definiert wurden.</p>
<p>Wenn man dynamische Sprachen hat, was ich jetzt als vorausgesetzt betrachtete, braucht das Objekt seine Klassenhirarchie nicht zu kennen. Es ist eher mit C++-Templates vergleichbar, die zur Laufzeit ausgewertet werden (und nicht so ein Mischling wie der Code TyRoXx).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171992</guid><dc:creator><![CDATA[warrylall]]></dc:creator><pubDate>Tue, 24 Jan 2012 18:32:16 GMT</pubDate></item></channel></rss>