<?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[Design-Frage: Lockere Kopplung und Callback]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen bestehenden Code, in dem eine Mini-Sprache geparst wird. Dabei emittiert ein Scanner Tokens. Diese Tokens werden durch statische Funktionen der abstrakten 'Token'-Klasse erstellt; beispielsweise (unvollständig):</p>
<pre><code class="language-cpp">struct Token {
    static Token* Identifier(string const&amp; name) { return new IdentifierToken(name); }
};

// Aufruf in der Scanner-Klasse:

// … blabla
return Token.Identifier(id);
</code></pre>
<p>So. Inzwischen macht das Debuggen meiner kleinen Codes aber sehr viel Mühe, daher wollte ich den Parser jetzt ein wenig aufbohren, dass er Code-Positions-Informationen verarbeitet. Im wesentlichen bekommt die 'Token'-Klasse ein zusätzliches Feld 'm_CodeRange' ('CodeRange' besteht aus zwei 'CodeLocation's), und die Scanner-Klasse erhält ebenfalls ein Feld 'm_CurrentRange'.</p>
<p>Dieses Feld muss ich jetzt bei der Erstellung eines Tokens initialisieren, und zwar mit 'm_CurrentRange' aus der Scanner-Klasse. Ich möchte aber nach Möglichkeit <em>nicht</em> überall in der Scanner-Klasse den Erstellungscode ändern. D.h. der Konstruktor der 'Token'-Basisklasse soll sich die Eigenschaft automatisch „ziehen“.</p>
<p>Leider ist die 'Scanner'-Klasse auch kein Singleton, sonst wäre das trivial. Sieht trotzdem jemand eine möglichkeit, das sauber zu implementieren? Der offensichtliche Weg wäre ja jetzt, die ganzen statischen Methoden einfach in die 'Scanner'-Klasse zu verlagern und nicht-statisch zu machen. Das würde aber bedeuten, dass ich bei allen Unterklassen von 'Token' den Konstruktor anpassen müsste. Das gefällt mir nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/214483/design-frage-lockere-kopplung-und-callback</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 11:38:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/214483.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 May 2008 20:02:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design-Frage: Lockere Kopplung und Callback on Thu, 29 May 2008 20:02:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen bestehenden Code, in dem eine Mini-Sprache geparst wird. Dabei emittiert ein Scanner Tokens. Diese Tokens werden durch statische Funktionen der abstrakten 'Token'-Klasse erstellt; beispielsweise (unvollständig):</p>
<pre><code class="language-cpp">struct Token {
    static Token* Identifier(string const&amp; name) { return new IdentifierToken(name); }
};

// Aufruf in der Scanner-Klasse:

// … blabla
return Token.Identifier(id);
</code></pre>
<p>So. Inzwischen macht das Debuggen meiner kleinen Codes aber sehr viel Mühe, daher wollte ich den Parser jetzt ein wenig aufbohren, dass er Code-Positions-Informationen verarbeitet. Im wesentlichen bekommt die 'Token'-Klasse ein zusätzliches Feld 'm_CodeRange' ('CodeRange' besteht aus zwei 'CodeLocation's), und die Scanner-Klasse erhält ebenfalls ein Feld 'm_CurrentRange'.</p>
<p>Dieses Feld muss ich jetzt bei der Erstellung eines Tokens initialisieren, und zwar mit 'm_CurrentRange' aus der Scanner-Klasse. Ich möchte aber nach Möglichkeit <em>nicht</em> überall in der Scanner-Klasse den Erstellungscode ändern. D.h. der Konstruktor der 'Token'-Basisklasse soll sich die Eigenschaft automatisch „ziehen“.</p>
<p>Leider ist die 'Scanner'-Klasse auch kein Singleton, sonst wäre das trivial. Sieht trotzdem jemand eine möglichkeit, das sauber zu implementieren? Der offensichtliche Weg wäre ja jetzt, die ganzen statischen Methoden einfach in die 'Scanner'-Klasse zu verlagern und nicht-statisch zu machen. Das würde aber bedeuten, dass ich bei allen Unterklassen von 'Token' den Konstruktor anpassen müsste. Das gefällt mir nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1519348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1519348</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 29 May 2008 20:02:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage: Lockere Kopplung und Callback on Thu, 29 May 2008 20:30:19 GMT]]></title><description><![CDATA[<p>Hmm.</p>
<p>Also du möchtest bei jeder Konstruktion eines Token Objektes dessen CodeRange mit dem Range von Scanner initialisieren, verstehe ich das richtig?</p>
<p>Mir fällt da so, wie ich das jetzt versteht nur Übergabe und statische Funktionen ein (egal in welcher Art).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1519361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1519361</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 29 May 2008 20:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to Design-Frage: Lockere Kopplung und Callback on Fri, 30 May 2008 06:35:35 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Also du möchtest bei jeder Konstruktion eines Token Objektes dessen CodeRange mit dem Range von Scanner initialisieren, verstehe ich das richtig?</p>
</blockquote>
<p>Ja.</p>
<blockquote>
<p>Mir fällt da so, wie ich das jetzt versteht nur Übergabe und statische Funktionen ein (egal in welcher Art).</p>
</blockquote>
<p>Hm ja, ich befürchte, ich muss es einfach umschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1519424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1519424</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 30 May 2008 06:35:35 GMT</pubDate></item></channel></rss>