<?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: Singleton &amp;quot;installieren&amp;quot;]]></title><description><![CDATA[<p>Tach auch,</p>
<p>ich habe gerade ein kleines Designproblem in meiner library:<br />
Es gibt ein Singleton, das den zentralen Logger zur Verfügung stellt. Dabei soll der Nutzer der library entscheiden können, wie er ihn implementiert, ob in eine Datei oder die Konsole oder wohin auch immer geloggt werden soll.</p>
<p>Derzeit ist das einfach so gemacht, dass in der library ein .h-File dabei ist, das etwa so aussieht:</p>
<pre><code class="language-cpp">/**
  * You must provide an implementation of this interface
  */
class LogWriter
    {
    public:
        virtual ~LogWriter() {}

        virtual void writeEntry(const LogEntry&amp; entry) = 0;
    };

    class Singleton : private boost::noncopyable {
    public:
        static LogWriter&amp; getLogger();

    private:
        Singleton();
    };
</code></pre>
<p>In einer Applikation sieht eine mögliche Implementierung so aus:</p>
<pre><code class="language-cpp">class ConsoleLogger: public LogWriter
{
public:

    void writeEntry(const LogEntry&amp; entry)
    { // timestamp, fehlerklasse und text nach std::cout schreiben
    }
};

LogWriter&amp; Singleton::getLogger()
{
    static ConsoleLogger logger;
    return logger;
}
</code></pre>
<p>Das gefällt mir aus zwei Gründen nicht:<br />
-Erstens bürdet es dem Benutzer auf, auch noch den Boilerplate für die Singleton::getLogger() Methode zu schreiben, die ja bis auf den Klassennamen des konkreten Loggers immer gleich wäre.<br />
-Zweitens ist es so nicht möglich, die library auch als dynamische library auszuliefern, da die dynamische Lib ja dann eine undefined reference auf die Singleton::getLogger Funktion hätte.</p>
<p>Was ich jetzt gerne hätte, wäre die Möglichkeit statisch einen Logger im Singleton installieren zu können. Statisch deswegen, weil ja möglicherweise schon beim ersten Erstellen irgendeiner Klasse ein log-würdiger Fehler auftreten könnte.</p>
<p>Also: Wie kriege ich es hin, dass das Singleton standardmäßig mit beispielweise einem Console-Logger einkompiliert wird (so dass es auf jeden Fall in einer dynamischen Lib keine unaufgelösten Referenzen mehr gibt, selbst wenn der Library-User keinen eigenen Logger implementiert), aber wenn eine solche Implementierung vorliegt, sie im Singleton &quot;installiert&quot; wird.</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268737/designfrage-singleton-quot-installieren-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 14:17:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268737.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Jun 2010 22:25:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Sun, 13 Jun 2010 22:27:34 GMT]]></title><description><![CDATA[<p>Tach auch,</p>
<p>ich habe gerade ein kleines Designproblem in meiner library:<br />
Es gibt ein Singleton, das den zentralen Logger zur Verfügung stellt. Dabei soll der Nutzer der library entscheiden können, wie er ihn implementiert, ob in eine Datei oder die Konsole oder wohin auch immer geloggt werden soll.</p>
<p>Derzeit ist das einfach so gemacht, dass in der library ein .h-File dabei ist, das etwa so aussieht:</p>
<pre><code class="language-cpp">/**
  * You must provide an implementation of this interface
  */
class LogWriter
    {
    public:
        virtual ~LogWriter() {}

        virtual void writeEntry(const LogEntry&amp; entry) = 0;
    };

    class Singleton : private boost::noncopyable {
    public:
        static LogWriter&amp; getLogger();

    private:
        Singleton();
    };
</code></pre>
<p>In einer Applikation sieht eine mögliche Implementierung so aus:</p>
<pre><code class="language-cpp">class ConsoleLogger: public LogWriter
{
public:

    void writeEntry(const LogEntry&amp; entry)
    { // timestamp, fehlerklasse und text nach std::cout schreiben
    }
};

LogWriter&amp; Singleton::getLogger()
{
    static ConsoleLogger logger;
    return logger;
}
</code></pre>
<p>Das gefällt mir aus zwei Gründen nicht:<br />
-Erstens bürdet es dem Benutzer auf, auch noch den Boilerplate für die Singleton::getLogger() Methode zu schreiben, die ja bis auf den Klassennamen des konkreten Loggers immer gleich wäre.<br />
-Zweitens ist es so nicht möglich, die library auch als dynamische library auszuliefern, da die dynamische Lib ja dann eine undefined reference auf die Singleton::getLogger Funktion hätte.</p>
<p>Was ich jetzt gerne hätte, wäre die Möglichkeit statisch einen Logger im Singleton installieren zu können. Statisch deswegen, weil ja möglicherweise schon beim ersten Erstellen irgendeiner Klasse ein log-würdiger Fehler auftreten könnte.</p>
<p>Also: Wie kriege ich es hin, dass das Singleton standardmäßig mit beispielweise einem Console-Logger einkompiliert wird (so dass es auf jeden Fall in einer dynamischen Lib keine unaufgelösten Referenzen mehr gibt, selbst wenn der Library-User keinen eigenen Logger implementiert), aber wenn eine solche Implementierung vorliegt, sie im Singleton &quot;installiert&quot; wird.</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911863</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sun, 13 Jun 2010 22:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 07:46:11 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich würde dir an dieser stelle empfehlen über die mögliche verwendung von <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-155350.html" rel="nofollow">&quot;Strategy Pattern&quot;</a>. Und entsprechend zur Auslieferung entwirfst du eines für die Console das Standardmäßig benutzt wird, und wenn der User was eigenes möchte, dann braucht er such _nur_ ums programmieren der Ausgabe kümmern.</p>
<p>kurze Beispiel (Aus dem kopf und so bitte nicht direkt benutzen):</p>
<pre><code class="language-cpp">struct IWriter {
   void writeOut( string sToOut ) = 0;
};

class ToConsole : public IWriter {
   void writeOut( string sToOut ) {
      cout &lt;&lt; time( void ) &lt;&lt; &quot;: &quot; &lt;&lt; sToOut &lt;&lt; endl;
   }
};

class logger {
   public:
      logger() {
         _myWriter = new ToConsole();
      }
      virtual ~logger() {
         if( _myWriter ) {
            delete _myWriter;
            _myWriter = NULL;
         }
      }

      void setLogger( IWriter &amp;newWriter ) {
         if( _myWriter ) {
            delete _myWriter
         }
         _myWriter = newWriter; // Des hier müsste man aber anders machen, grad nur keine idee mehr wie.
      }

      void writeEntry( sEntry ) {
         _myWriter.writeOut( sEntry );
      }
      // .. und hier noch deine anderen Implementierungen und die Sachen fuers Singleton.
   private:
      IWriter *_myWriter;
};
</code></pre>
<p>Wie gesagt Code soll nur zur demonstration dienen. In dem Fall braucht dann ein User einfach nur von der &quot;IWriter&quot;-Struktur erben, seinen Klasse dann entsprechend schreiben und von dieser dann ein Objekt an die logger-Klasse übergeben.</p>
<p>Mfg marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911921</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Mon, 14 Jun 2010 07:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 08:22:35 GMT]]></title><description><![CDATA[<p>Testen auf 0 ist bei delete nicht nötig.<br />
Das machts schon selbst.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911939</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 14 Jun 2010 08:22:35 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 09:18:52 GMT]]></title><description><![CDATA[<p>Danke für den ersten Ansatz. Habe das ganze jetzt so gemacht, allerdings mit intelligenten Zeigern.</p>
<p>Einziges Problem ist, dass der Strategiewechsel immer noch zur Laufzeit passiert, und nicht schon zur Compilezeit gewechselt werden kann.</p>
<p>Ich fordere ja jetzt, dass der Library-Nutzer eine Strategie implementiert und dann</p>
<pre><code class="language-cpp">Singleton::getLogger().setStrategy(new MeineStrategy);
</code></pre>
<p>aufruft. Wenn dieser Aufruf im Code steht, läuft das Programm ja schon. Das heißt, statisch initialisierte Objekte, die in ihren Konstruktoren was geloggt haben, haben noch die default-Strategie verwendet.</p>
<p>Bei meiner alten Lösung war durch das implementieren der Singelton::getLogger Funktion ja schon zur Kompilierzeit klar, was für eine Strategie verwendet werden soll.</p>
<p>Gibt's irgendeine Template-Magie nach dem Motto &quot;aha, ich wurde implementiert, dann installier ich mich mal in der Klasse XYZ&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911973</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 14 Jun 2010 09:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 13:01:46 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Danke für den ersten Ansatz. Habe das ganze jetzt so gemacht, allerdings mit intelligenten Zeigern.</p>
<p>Einziges Problem ist, dass der Strategiewechsel immer noch zur Laufzeit passiert, und nicht schon zur Compilezeit gewechselt werden kann.</p>
<p>Ich fordere ja jetzt, dass der Library-Nutzer eine Strategie implementiert und dann</p>
<pre><code class="language-cpp">Singleton::getLogger().setStrategy(new MeineStrategy);
</code></pre>
<p>aufruft. Wenn dieser Aufruf im Code steht, läuft das Programm ja schon. Das heißt, statisch initialisierte Objekte, die in ihren Konstruktoren was geloggt haben, haben noch die default-Strategie verwendet.</p>
<p>Bei meiner alten Lösung war durch das implementieren der Singelton::getLogger Funktion ja schon zur Kompilierzeit klar, was für eine Strategie verwendet werden soll.</p>
<p>Gibt's irgendeine Template-Magie nach dem Motto &quot;aha, ich wurde implementiert, dann installier ich mich mal in der Klasse XYZ&quot;?</p>
</blockquote>
<p>Hy</p>
<p>Ich versteh jetzt nicht ganz dein Problem, wenn du diese setStrategy-Funktion ganz am Anfang der Main aufrufst, dann wird diese doch auch für alle Konstruktoren festgelegt. Bzw. wenn du dies so in deinen Code vor den Funktionen aufrufst sollte dies funktionieren:</p>
<pre><code class="language-cpp">namespace {
   Singleton::getLoger().setStrategy( new MeineStrategy );
}
</code></pre>
<p>Zumindest nehme ich diese Technik bei meinen Projekt die Möglichkeit zu haben das sie die Plugins die ich über Dlls lade sich selbst eintragen.</p>
<p>Mfg marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912149</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Mon, 14 Jun 2010 13:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 14:09:50 GMT]]></title><description><![CDATA[<p>Marc-O schrieb:</p>
<blockquote>
<p>Ich versteh jetzt nicht ganz dein Problem, wenn du diese setStrategy-Funktion ganz am Anfang der Main aufrufst, dann wird diese doch auch für alle Konstruktoren festgelegt.</p>
</blockquote>
<p>Statische Objekte werden aber <strong>vor</strong> dem Eintritt in die main angelegt.</p>
<blockquote>
<p>Bzw. wenn du dies so in deinen Code vor den Funktionen aufrufst sollte dies funktionieren:</p>
<pre><code class="language-cpp">namespace {
   Singleton::getLoger().setStrategy( new MeineStrategy );
}
</code></pre>
</blockquote>
<p>Aber leider ist die Reihenfolge solcher statischen Initialisierungen über mehrere Compileunits nicht definiert. Das kann also irgendwann initialisiert werden. Dann habe ich wahrscheinlich manche Konstruktoren, die mit der default-strategy loggen, und ein paar, die mit MeineStrategy loggen. Klingt mir nicht nach einer guten Idee.</p>
<p>Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912203</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 14 Jun 2010 14:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 14:57:46 GMT]]></title><description><![CDATA[<p>Vielleicht so etwas?</p>
<pre><code class="language-cpp">class ConsoleLogger{};

template&lt;typename T&gt;
class SingletonHolder : public boost::noncopyable
{
private:
// ...

public:
	static T&amp; getLogger() { static T logger; return logger; }

};

// Library Header Template
typedef SingletonHolder&lt;ConsoleLogger&gt; Singleton;

// somewhere in a file...
class A
{
   A() { Singleton::getLogger().writeLog(&quot;...&quot;); }
};

A a;

// ......................

int main()
{
	Singleton::getLogger();
}
</code></pre>
<p>Wer keinen Logger schreibt, nutzt das Library Header Template &quot;as is&quot;, wer einen eigenen Logger einhängt, ändert nur den Typedef</p>
<p>:schland: :schland:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912237</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Mon, 14 Jun 2010 14:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 15:18:34 GMT]]></title><description><![CDATA[<p>Das klingt nach einem richtig guten Plan, hat aber noch einen Schönheitsfehler:<br />
Wenn ich den default-Logger mit</p>
<pre><code class="language-cpp">typedef SingletonHolder&lt;ConsoleLogger&gt; Singleton;
</code></pre>
<p>installiere, der User dann aber seine eingene Implementierung baut und</p>
<pre><code class="language-cpp">typedef SingletonHolder&lt;MyFancyLogger&gt; Singleton;
</code></pre>
<p>macht, dann gibts einen conflicting typedef.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912247</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 14 Jun 2010 15:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 21:16:41 GMT]]></title><description><![CDATA[<p>Herren der schwarzen Template-Magie, wo seid ihr? <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/1912479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912479</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 14 Jun 2010 21:16:41 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 22:30:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef SingletonHolder&lt;ConsoleLogger&gt; MyConsoleLogger;

typedef SingletonHolder&lt;FancyLogger&gt; MyFancyLogger;
</code></pre>
<p>und alles wird gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912507</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 14 Jun 2010 22:30:04 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 22:50:14 GMT]]></title><description><![CDATA[<p>Ich geb's auf und geh Schrauben sortieren ... <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/1912513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912513</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 14 Jun 2010 22:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 22:51:12 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Ich geb's auf und geh Schrauben sortieren ... <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>
</blockquote>
<p>Das Heizöl hacken hast mir besser gefallen <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/1912514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912514</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Mon, 14 Jun 2010 22:51:12 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Mon, 14 Jun 2010 23:37:13 GMT]]></title><description><![CDATA[<p>Wenn du eine Strategie zur Kompilezeit festlegen willst, dann mach das über <a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">Policies</a>.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912518</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 14 Jun 2010 23:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Tue, 15 Jun 2010 00:10:15 GMT]]></title><description><![CDATA[<p>Als dynamische Bibliothek wirst du das in der Form jedenfalls nicht hinkriegen - du willst die Strategie zur Compilezeit festlegen, und wenn die Bibliothek einmal kompiliert ist, ist die Compilezeit vorbei.</p>
<p>Denkbar wäre, es zur Linkzeit zu verschieben, so dass der Benutzer dir eine andere Bibliothek hinlegen kann, aus der sich deine Klasse entsprechende Funktionen holen kann. Allerdings ist das ziemlich umständlich, insbesondere, wenn das Backend parametrisiert werden will - etwa ein Dateilogger, der einen Dateinamen braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912524</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 15 Jun 2010 00:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Tue, 15 Jun 2010 00:11:23 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Wenn du eine Strategie zur Kompilezeit festlegen willst, dann mach das über <a href="http://en.wikipedia.org/wiki/Policy-based_design" rel="nofollow">Policies</a>.</p>
<p>Grüssli</p>
</blockquote>
<p>Auch die sehen sher interessant aus, lösen aber nicht mein Problem:<br />
Auch hier muss ich ja eine standard-policy per typedef festlegen.<br />
Und wenn dann der Librarynutzer seine andere Policy geschrieben hat, kann er kein typedef mehr anlegen, dass diese Policy zum standard erklärt. Conflicting typedef. Ich glaub wir drehen uns gerade im Kreis!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912525</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 15 Jun 2010 00:11:23 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Tue, 15 Jun 2010 00:22:04 GMT]]></title><description><![CDATA[<p>Okay, neuer Vorschlag:<br />
Wenn wir Problem 1 nicht lösen können, dann wenigstens Problem 2:<br />
Gibt es eine Möglichkeit dem Linker beim Zusammenbauen der dynamsichen Library zu sagen &quot;Das excutyble, das diese lib später benutzen wird, bietet garantiert die Funktion XYZ an&quot;, so dass ich den alten Mechanismus mit dem undefiniert lassen und erst in der Applikation definieren, in die dynamische library rüberretten kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912526</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 15 Jun 2010 00:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Tue, 15 Jun 2010 07:40:54 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Auch die sehen sher interessant aus, lösen aber nicht mein Problem:<br />
Auch hier muss ich ja eine standard-policy per typedef festlegen.<br />
Und wenn dann der Librarynutzer seine andere Policy geschrieben hat, kann er kein typedef mehr anlegen, dass diese Policy zum standard erklärt. Conflicting typedef. Ich glaub wir drehen uns gerade im Kreis!</p>
</blockquote>
<p>Moment, heisst das, dass der Logger bereits schon für die statischen und globalen Objekte deiner Bibliothek funktionieren soll, welche du als vorkompilierte DLL oder ähnliches mitliefern willst? Das kannst du kreuzweise vergessen.</p>
<p>Aber was du machen kannst, ist eine Standardstrategie zu definieren, welche die Log-Einträge irgendwo abspeichert, bis der User eine Strategie definiert, mit welcher diese Einträge verwaltet werden können. Sobald er also setStrategy aufruft, werden alle bisherigen Einträge mit dieser Strategie behandelt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912591</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 15 Jun 2010 07:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Singleton &amp;quot;installieren&amp;quot; on Tue, 15 Jun 2010 15:07:45 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Okay, neuer Vorschlag:<br />
Wenn wir Problem 1 nicht lösen können, dann wenigstens Problem 2:<br />
Gibt es eine Möglichkeit dem Linker beim Zusammenbauen der dynamsichen Library zu sagen &quot;Das excutyble, das diese lib später benutzen wird, bietet garantiert die Funktion XYZ an&quot;, so dass ich den alten Mechanismus mit dem undefiniert lassen und erst in der Applikation definieren, in die dynamische library rüberretten kann?</p>
</blockquote>
<p>Das geht, kann aber compilerabhängig Kunstgriffe erfordern. Wenn ich mich recht entsinne, muss bei Verwendung des gcc beispielsweise das Programm mit -Wl,-E kompiliert werden, damit die Executable eine dynamische Symboltabelle bekommt, die der Linker benutzen kann.</p>
<p>Wie es bei anderen Compilern aussieht, kann ich dir aus dem Stand nicht sagen - ich hab sowas nie gebraucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912798</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 15 Jun 2010 15:07:45 GMT</pubDate></item></channel></rss>