<?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[Codedesign: Logging Class]]></title><description><![CDATA[<p>Hi,</p>
<p>ich denke ich habe mich in den letzten Wochen gut in C++ eingearbeitet. Was mir jetzt noch fehlt, sind die &quot;Erfahrungswerte&quot; in Bezug auf gutes Codedesign.</p>
<p>Nocheinmal am Beispiel einer Logging-Klasse:</p>
<p><strong>1ter Vorschlag:</strong></p>
<pre><code class="language-cpp">// am Anfang
int main() {
  Log::open( &quot;name.log&quot; );
  ...
}

// in einer x-beliebigen Funktion
Log::write( &quot;dies wird geloggt&quot; );
</code></pre>
<p>wobei open und write beides <strong>statische</strong> Methoden sind.</p>
<p><strong>2ter Vorschlag:</strong></p>
<pre><code class="language-cpp">// am Anfang
int main() {

  Log *instance = Log::getInstance();

  instance-&gt;open( &quot;name.log&quot; );
  ...
}

// in einer x-beliebigen Funktion
Log *instance = Log::getInstance();

instance-&gt;write( &quot;dies wird geloggt&quot; );

//oder auch möglich:
instance &lt;&lt; &quot;dies könnte auch geloggt werden&quot;;
</code></pre>
<p>hier ist Log eine <strong>Singleton Klasse</strong>, bei der eine Instanz über die statische Methode getInstance geholt werden kann.</p>
<p><strong>3ter Vorschlag:</strong></p>
<pre><code class="language-cpp">// Global
Log log;

int main() {

  log.open( &quot;name.log&quot; );
  ...
}

// in einer x-beliebigen Funktion

log &lt;&lt; &quot;dies wird geloggt&quot;;
</code></pre>
<p>Log ist ein <strong>globales</strong> Objekt. Mit &lt;&lt; überladen.</p>
<p>Wie gesagt, das sind alles Vorschläge, die durchgekaut habe.<br />
Vom Aufruf gefällt mir Nr 3 am Besten. Doch stört mich das globale Object.<br />
Habe mir irgendwann mal im Hinterkopf gespeichert, dass globale Objekte böse sind <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>
<p>Was meint ihr?</p>
<p>Grüße<br />
euer Maddes</p>
<p>Ps: Die Codeschnipsel verstehen sich als stark gekürzte Beispiele <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/topic/176159/codedesign-logging-class</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 13:44:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176159.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Mar 2007 14:25:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 15:02:22 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich denke ich habe mich in den letzten Wochen gut in C++ eingearbeitet. Was mir jetzt noch fehlt, sind die &quot;Erfahrungswerte&quot; in Bezug auf gutes Codedesign.</p>
<p>Nocheinmal am Beispiel einer Logging-Klasse:</p>
<p><strong>1ter Vorschlag:</strong></p>
<pre><code class="language-cpp">// am Anfang
int main() {
  Log::open( &quot;name.log&quot; );
  ...
}

// in einer x-beliebigen Funktion
Log::write( &quot;dies wird geloggt&quot; );
</code></pre>
<p>wobei open und write beides <strong>statische</strong> Methoden sind.</p>
<p><strong>2ter Vorschlag:</strong></p>
<pre><code class="language-cpp">// am Anfang
int main() {

  Log *instance = Log::getInstance();

  instance-&gt;open( &quot;name.log&quot; );
  ...
}

// in einer x-beliebigen Funktion
Log *instance = Log::getInstance();

instance-&gt;write( &quot;dies wird geloggt&quot; );

//oder auch möglich:
instance &lt;&lt; &quot;dies könnte auch geloggt werden&quot;;
</code></pre>
<p>hier ist Log eine <strong>Singleton Klasse</strong>, bei der eine Instanz über die statische Methode getInstance geholt werden kann.</p>
<p><strong>3ter Vorschlag:</strong></p>
<pre><code class="language-cpp">// Global
Log log;

int main() {

  log.open( &quot;name.log&quot; );
  ...
}

// in einer x-beliebigen Funktion

log &lt;&lt; &quot;dies wird geloggt&quot;;
</code></pre>
<p>Log ist ein <strong>globales</strong> Objekt. Mit &lt;&lt; überladen.</p>
<p>Wie gesagt, das sind alles Vorschläge, die durchgekaut habe.<br />
Vom Aufruf gefällt mir Nr 3 am Besten. Doch stört mich das globale Object.<br />
Habe mir irgendwann mal im Hinterkopf gespeichert, dass globale Objekte böse sind <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>
<p>Was meint ihr?</p>
<p>Grüße<br />
euer Maddes</p>
<p>Ps: Die Codeschnipsel verstehen sich als stark gekürzte Beispiele <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/1247734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247734</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Sun, 18 Mar 2007 15:02:22 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 14:33:13 GMT]]></title><description><![CDATA[<p>1. Vorschlag:<br />
Und wie willst du dann den Filepointer beibehalten? Also das wird dir bei statischen Funktion schwer fallen, da die ja nicht ohneweiteres auf den this-Pointer zugreifen können.</p>
<p>2. Vorschlag:<br />
Das ist schon einmal eine relativ gute Idee. So musst du dich nicht darum kümmern, wie du einen Log-Pointer weitergibst, damit du in allen Klassen damit arbeiten kannst, damit du globale Variablen vermeidest. Dein Singleton ist aber nicht so dolle implementiert. Wenn du den &lt;&lt; operator bei der Klasse aber noch überlädst, wäre die Lösung die beste.</p>
<p>3. Vorschlag<br />
Globale Variablen sind nicht gut. Kommst da schöner mit dem 2. Vorschlag und meinen Verbesserungsvorschlägen hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247741</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 18 Mar 2007 14:33:13 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 15:01:47 GMT]]></title><description><![CDATA[<p>Hi,</p>
<blockquote>
<p>Und wie willst du dann den Filepointer beibehalten?</p>
</blockquote>
<p>Spontan würde ich so antworten:</p>
<pre><code class="language-cpp">class Log {

  private:

    static ofstream log;

  public:

    static void write( ... ) {

      log &lt;&lt; ...

  (...)
</code></pre>
<blockquote>
<p>Dein Singleton ist aber nicht so dolle implementiert</p>
</blockquote>
<p>Hilft mir 0 weiter.</p>
<blockquote>
<p>Wenn du den &lt;&lt; operator bei der Klasse aber noch überlädst</p>
</blockquote>
<p>siehe Beispiel <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>Weitere Vorschläge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247766</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Sun, 18 Mar 2007 15:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 15:05:35 GMT]]></title><description><![CDATA[<p>Ich würde 2 und 3 kombinieren. Also die Loggingklasse zu einem Singleton machen und eine Instanz erszeugen. Die Klasse und die Instanz aber in einen eigenen Namespace packen. So ähnlich wie cout etc. Und auch eine Methode anbieten, um das Loggingfile zu ändern. Das dürfte für den Anwender die einfachste Variante sein.</p>
<p>Achso zum Singleton: guck dir mal Loki an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247773</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Sun, 18 Mar 2007 15:05:35 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 15:15:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Klasse und die Instanz aber in einen eigenen Namespace packen</p>
</blockquote>
<p>Das ist eine Idee, die ich noch gar nicht in Betracht gezogen habe. Klassisches Wald/Baum Problem <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>Werd da mal ein bisschen rumprobieren <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>Danke dir vielmals!!!</p>
<p>Maddes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247782</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Sun, 18 Mar 2007 15:15:22 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 15:29:01 GMT]]></title><description><![CDATA[<p>Hmm halt nochn Streamoperator überladen ... aber ansonnsten so:</p>
<pre><code class="language-cpp">#if !defined(LOG_H__INCLUDED)
#define LOG_H__INCLUDED

class Log
{
private:
	Log();
	~Log();

public:
	static Log&amp; instance() { static Log log; return log; }

public:
	bool	open(const std::wstring&amp;);

private:
	std::wofstream m_stream;
};

#endif // LOG_H__INCLUDED
</code></pre>
<pre><code class="language-cpp">#include &quot;log.h&quot;

Log::~Log()
{
	if (m_stream.is_open() == true)
		m_stream.close();
}

bool Log::open(const std::wstring&amp; filename)
{
	if (m_stream.is_open() == true)
		m_stream.close();

	m_stream.open(filename.c_str(), std::ios::out);

	return (!m_stream ? false : true);
}
</code></pre>
<pre><code class="language-cpp">#include &quot;log.h&quot;

int main()
{
	Log::instance().open(L&quot;test.log&quot;);
	Log::instance() &lt;&lt; &quot;Test 1&quot;;
}
</code></pre>
<p>Das wäre was nettes <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/1247793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247793</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 18 Mar 2007 15:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 15:57:06 GMT]]></title><description><![CDATA[<p>@(D)Evil</p>
<p>starke Sache <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>sieht wirklich gut aus <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>Mal ein Beispiel mit der Idee von viande mit nem Namensraum (Klasse Logging wie oben):</p>
<pre><code class="language-cpp">namespace Log {

	Logging&amp; log = Logging::getInstance();
}
</code></pre>
<p>Überladen:</p>
<pre><code class="language-cpp">void Logging::operator &lt;&lt;( char* msg ) 
{
	// hier in datei schreiben

}
</code></pre>
<p>würde das schon genügen?</p>
<p>Funktionieren tut es auf jedenfall, aber vielleicht habe ich ja noch was nicht bedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">int main()
{
  using namespace Log;

  log &lt;&lt; &quot;moin moin&quot;;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1247813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247813</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Sun, 18 Mar 2007 15:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 16:09:36 GMT]]></title><description><![CDATA[<p>Maddes schrieb:</p>
<blockquote>
<pre><code class="language-cpp">namespace Log {

    Logging log = Logging::getInstance();
    //Referenzzeichen weg
}
</code></pre>
<p>Überladen:</p>
<pre><code class="language-cpp">void Logging::operator &lt;&lt;(const char* msg )
//das const ist wichtig, sonst wird dein Aufruf unten fehlschlagen
{
    // hier in datei schreiben

}
</code></pre>
<p>würde das schon genügen?</p>
<p>Funktionieren tut es auf jedenfall, aber vielleicht habe ich ja noch was nicht bedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">int main()
{
  using namespace Log;

  log &lt;&lt; &quot;moin moin&quot;;

}
</code></pre>
</blockquote>
<p>Echt, das hat funktioniert? :o<br />
Aber sonst sieht das von der Idee her so aus, ja. Vielleicht sogar lieber nur using Log::log.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247821</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Sun, 18 Mar 2007 16:09:36 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 16:21:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Echt, das hat funktioniert? :o</p>
</blockquote>
<p>jaja, du weisst doch was gemeint war <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="😃"
    /><br />
Passiert, wenn man an zwei Codes gleichzeitig schreibt (ich glaub das können nur Frauen...)</p>
<p>Jetzt noch eine Lösung zu folgenem und ich bin glücklich <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>
<pre><code class="language-cpp">void Logging::operator &lt;&lt;( string msg ) 
// oder const char* msg oder wie auch immer man möchte
</code></pre>
<p>funzt super:</p>
<pre><code class="language-cpp">log &lt;&lt; &quot;blabla&quot;;
</code></pre>
<p>aber mittels:</p>
<pre><code class="language-cpp">void Logging::operator &lt;&lt;( string msg ) 
...
void Logging::operator ()( int loglevel )
...
</code></pre>
<p>funktioniert sowas:</p>
<pre><code class="language-cpp">log(1) &lt;&lt; &quot;blabla&quot;;
</code></pre>
<p>leider nicht:</p>
<blockquote>
<p>Fehler: void-Wert nicht ignoriert wie es sein sollte</p>
</blockquote>
<p>Dachte mir, damit könnte man einen &quot;Loglevel&quot; (debug, warning, error, etc) mitschicken.</p>
<p>Auf jedenfall schon mal ein dickes Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247834</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Sun, 18 Mar 2007 16:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 17:24:42 GMT]]></title><description><![CDATA[<p>Maddes schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void Logging::operator &lt;&lt;( string msg ) 
// oder const char* msg oder wie auch immer man möchte
</code></pre>
<p>funzt super:</p>
<pre><code class="language-cpp">log &lt;&lt; &quot;blabla&quot;;
</code></pre>
</blockquote>
<p>Ja. Aber das hier funzt gar nicht super:</p>
<pre><code class="language-cpp">int my_value = 42;
log &lt;&lt; &quot;Wert = &quot; &lt;&lt; my_value;
</code></pre>
<p>Also: 'op&lt;&lt;' um zwei Dinge erweitern:</p>
<p>1. Parameter sollte ein Template sein<br />
2. Zum Verketten muss der Log zurückgegeben werden.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
Logging&amp; Logging::operator &lt;&lt;(T const&amp; msg)
{
    // msg in die Datei schreiben.
    return *this;
}
</code></pre>
<p>/EDIT: Und für Deinen 'op()' gilt übrigens dasselbe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247870</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 18 Mar 2007 17:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 17:24:16 GMT]]></title><description><![CDATA[<p>Maddes schrieb:</p>
<blockquote>
<blockquote>
<p>Echt, das hat funktioniert? :o</p>
</blockquote>
<pre><code class="language-cpp">void Logging::operator &lt;&lt;( string msg ) 
...
Logging &amp;Logging::operator ()( int loglevel ) //referenz auf *this zurückgeben, dann sollte das weiter unten funktionieren
...
</code></pre>
<p>funktioniert sowas:</p>
<pre><code class="language-cpp">log(1) &lt;&lt; &quot;blabla&quot;;
</code></pre>
</blockquote>
<p>Du musst IMHO einfach eine Referenz auf *this vom operator() zurückgeben, dann sollte das mit dem Loglevel funktionieren. (Hab da mal nicht auf const-correctness geachtet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247873</guid><dc:creator><![CDATA[YASC]]></dc:creator><pubDate>Sun, 18 Mar 2007 17:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 17:33:26 GMT]]></title><description><![CDATA[<blockquote>
<p>Zum Verketten muss der Log zurückgegeben werden</p>
</blockquote>
<blockquote>
<p>einfach eine Referenz auf *this vom operator() zurückgeben</p>
</blockquote>
<p>Danke euch beiden, das wars <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>Die Template-Idee ist jetzt die Luxusklasse <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>so gefällt mir das!</p>
<p>Danke an Alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247877</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Sun, 18 Mar 2007 17:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 17:37:10 GMT]]></title><description><![CDATA[<p>Achja ... wäre vllt ganz gut wenn du noch mit templates arbeiten würdest, um für alle dateitypen den streamoperator nutzen zu können <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/1247880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247880</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 18 Mar 2007 17:37:10 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Sun, 18 Mar 2007 18:05:52 GMT]]></title><description><![CDATA[<p>trotzdem geht an makros kein weg vorbei, wenn du vermeiden willst, daß die argumente (manchmal teure funktionsaufrufe) ausgewertet werden, wenn das eingestellte loglevel gerade sagt, daß diese zeile nicht loggen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247900</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 18 Mar 2007 18:05:52 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Mon, 19 Mar 2007 08:53:29 GMT]]></title><description><![CDATA[<blockquote>
<p>trotzdem geht an makros kein weg vorbei</p>
</blockquote>
<p>hmmf, ja, das durft ich grad selbst herausfinden <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>
<p>wenn ich zum Beispiel</p>
<pre><code class="language-cpp">log(1) &lt;&lt; &quot;foo &quot; &lt;&lt; &quot;bar&quot;;
</code></pre>
<p>habe, schreibt er:</p>
<blockquote>
<p>DEBUG: hallo DEBUG: bar</p>
</blockquote>
<p>das ist natürlich auch Quatsch. Dort müsste man wahrscheinlich eine Flag setzten, wenn DEBUG (oder was auch immer) ausgegeben wurde, und bei einem Newline diese wieder löschen. Oder so in der Art <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>
<p>Da mir das aber alles noch zu unklar ist, lasse ich dieses Feature lieber ersteinmal raus.</p>
<p>Es ist da aber gleich noch ein Problem aufgetreten - und zwar mit dem Namesraum: (sorry für die noob-hafte Formulierung)</p>
<p>Beim Testen habe ich also auf eine Header verzichtet, und alles in eine test.cpp gepackt:</p>
<pre><code class="language-cpp">class Logging {
...
}

namespace Log {

  Logging log = Logging::getInstance();

}

int main() {

  Log::log &lt;&lt; &quot;hallo&quot;;

}
</code></pre>
<p>das hat so (in der Art) auch funktioniert.</p>
<p>Jetzt möchte ich aber die Implementierung und die Methodendefinition aber trennen, was nicht ganz klappt.</p>
<p>Zum Beispiel:</p>
<pre><code class="language-cpp">//class.Log.h

class Logging {
...
};

namespace Log {

  Logging log = Logging::getInstance();

}
</code></pre>
<pre><code class="language-cpp">//class.Log.cpp

#include &quot;class.Log.h&quot;

Logging:: ...
</code></pre>
<p>das will nicht recht. Auch habe ich versucht, die Klasse mit in den Namesraum zu packen.<br />
Fehler beim Kompilieren von test.cpp : <em>multiple definition of `Log::log'</em></p>
<p>Ich habs dann ersteinmal mit einem Makro gelöst:</p>
<pre><code class="language-cpp">#define log Logging::getInstance()
</code></pre>
<p>Aber weiss nicht, ob das so die geschickteste und sauberste Lösung ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248171</guid><dc:creator><![CDATA[Maddes]]></dc:creator><pubDate>Mon, 19 Mar 2007 08:53:29 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Mon, 19 Mar 2007 14:11:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//log.hpp
namespace Log
{
    class Logging
    {
        //...
    };

Logging log = Logging::getInstance();
}

//log.cpp
#include log.hpp
namespace Log
{
    Logging::Logging()
    {
    }
}
</code></pre>
<p>Das geht nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248411</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Mon, 19 Mar 2007 14:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Mon, 19 Mar 2007 14:36:25 GMT]]></title><description><![CDATA[<p>Der Sinn von dem ganzen Code ist nur fragwürdig, so wie ihr das im Moment macht ... dann kann man auch direkt globale Instanzen nehmen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248448</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 19 Mar 2007 14:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Mon, 19 Mar 2007 14:54:42 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Der Sinn von dem ganzen Code ist nur fragwürdig, so wie ihr das im Moment macht ... dann kann man auch direkt globale Instanzen nehmen ...</p>
</blockquote>
<p>Klar kann man das, aber möchtest du gerne, dass an zwei verschiedenen Stellen geloggt wird, nur weil jemand auf die Idee kommt noch eine Instanz zu erzeugen?</p>
<p>Alternativ wäre es auch möglich, alle Methoden und Attribute static zu machen. Find ich aber persönlich hässlich.<br />
Bleibt noch die Möglichkeit den Konstruktor privat zu machen und eine Friend-Methode statt der getInstanze()-Methode bereit zu stellen, aber da ist die Singleton-Variante schöner.<br />
Oder hast du noch einen Vorschlag?</p>
<p>Außerdem wird die Instanz im Namespace &quot;versteckt&quot; und sollte daher für keine Konflikte sorgen. Und es erspart einem Tipparbeit und sorgt für Übersichtlichkeit. Find ich zumindest <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/1248464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248464</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Mon, 19 Mar 2007 14:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Mon, 19 Mar 2007 16:18:33 GMT]]></title><description><![CDATA[<p>Hmm du weißt das ich den Code zum Thema Singleton gepostet hab? Und ich mich mich eigentlich mit der globalen Instanz darauf bezog, das ihr hingeht, und, zwar in einem namespace, wieder eine Instanz habt. Das ist unnötig ... warum ruft ihr nicht einfach instance immer auf? Ist nun wirklich nicht soo viel aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248543</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 19 Mar 2007 16:18:33 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Mon, 19 Mar 2007 19:35:13 GMT]]></title><description><![CDATA[<p>Ich wollte dich nicht angreifen, tut mir Leid, wenn es vielleicht so rübergekommen ist.</p>
<p>Worum es mir geht, ist, dass ich finde, dass die Variante mit getInstance einfach schwerer zu lesen ist. Außerdem sieht man nicht sofort, was da passiert und der Anwender der Loggingklasse muss sich darüber Gedanken machen, dass die Klasse als Singleton implementiert ist.</p>
<p>Ich wollte einfach nur wissen, ob du vielleicht noch eine gute Lösung für das Problem hast. Würde mich auch im Allgemeinen mal interessieren.</p>
<pre><code class="language-cpp">Logging::getInstance() &lt;&lt; &quot;Text&quot;;
//Hier müste ich erstmal raten, dass die Klasse vielleicht ein Singleton ist
//oder ich müsste in die Dokumentation gucken

logging::log &lt;&lt; &quot;Text&quot;;
//bzw
using logging::log;
log &lt;&lt; &quot;Text&quot;;
//Hier sieht man einfach auf einen Schlag, was passiert.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1248719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248719</guid><dc:creator><![CDATA[viande]]></dc:creator><pubDate>Mon, 19 Mar 2007 19:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Tue, 20 Mar 2007 07:03:11 GMT]]></title><description><![CDATA[<p>viande schrieb:</p>
<blockquote>
<p>Außerdem sieht man nicht sofort, was da passiert und der Anwender der Loggingklasse muss sich darüber Gedanken machen, dass die Klasse als Singleton implementiert ist.</p>
</blockquote>
<p>Andererseits sieht der Anwender sofort das es sich um ein Singleton handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248880</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Tue, 20 Mar 2007 07:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Wed, 21 Mar 2007 20:03:53 GMT]]></title><description><![CDATA[<p>Maddes schrieb:</p>
<blockquote>
<blockquote>
<p>trotzdem geht an makros kein weg vorbei</p>
</blockquote>
<p>hmmf, ja, das durft ich grad selbst herausfinden <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="😞"
    /><br />
wenn ich zum Beispiel</p>
<pre><code class="language-cpp">log(1) &lt;&lt; &quot;foo &quot; &lt;&lt; &quot;bar&quot;;
</code></pre>
<p>habe, schreibt er:</p>
<blockquote>
<p>DEBUG: hallo DEBUG: bar</p>
</blockquote>
<p>das ist natürlich auch Quatsch. Dort müsste man wahrscheinlich eine Flag setzten, wenn DEBUG (oder was auch immer) ausgegeben wurde, und bei einem Newline diese wieder löschen. Oder so in der Art <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>
</blockquote>
<p>nein, da müßtest du zu tief in die stream-klassen einsteigen. eher gar nicht auf ein Newline achten, sondern ein</p>
<pre><code class="language-cpp">struct EndLogLine{
};
const EndLogLine endLogLine;
</code></pre>
<p>und<br />
log(1) &lt;&lt; &quot;foo &quot; &lt;&lt; &quot;bar&quot; &lt;&lt; endLogLine;</p>
<p>besser fühlt sich für mich an</p>
<pre><code class="language-cpp">//ungetestet
char *loglevelNames[]={&quot;DEBUG&quot;,...};
enum Loglevel{DEBUG,...};
class LogProxy{
   ofstream file;
public:
   LogProxy(Loglevel loglevel)
   :file(&quot;log.txt&quot;){
      file&lt;&lt;getTimeString()&lt;&lt;' '&lt;&lt;loglevelNames[loglevel]&lt;&lt;&quot;: &quot;;
   }
   ~LogProxy(){
      file&lt;&lt;'\n';
   }
   friend template&lt;typename T&gt;
   LogProxy operator&lt;&lt;(T&amp; t){
      file&lt;&lt;t;
      return *this;
   }
};
#define LOG(level,tolog) \
#if (level)&gt;=(LOGLEVEL) \
  LogProxy(level)&lt;&lt;tolog
#endif

...

LOG(DEBUG,(&quot;user &quot;&lt;&lt;getUserName()&lt;&lt;&quot; hat sich eingeloggt.&quot;));
...
LOG(DEBUG,(&quot;foo(&quot;&lt;&lt;x&lt;&lt;','&lt;&lt;y&lt;&lt;&quot;)=&quot;&lt;&lt;foo(x,y));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1250061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250061</guid><dc:creator><![CDATA[volkardus]]></dc:creator><pubDate>Wed, 21 Mar 2007 20:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Codedesign: Logging Class on Wed, 21 Mar 2007 20:21:14 GMT]]></title><description><![CDATA[<p>Maddes schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// am Anfang
int main() {
  Log::open( &quot;name.log&quot; );
  ...
}
// in einer x-beliebigen Funktion
Log::write( &quot;dies wird geloggt&quot; );
</code></pre>
</blockquote>
<p>nö, eher nicht. es mag zwar ein wenig performance bvringen, das file nicht für jede zeile (bei mir sinds ja zeilen und nicht &lt;&lt;-aufrufe) zu öffnen und zu schließen, aber gemeinerweise sind die fehler, die das prog hart terminieren und dabei dann lustigerweise eine halbgeschriebene logdatei zurücklassen die gemeinsten. logs zu debuggingzwecken sollten dafür sorgen, daß wenn man vor einen kritischen aufruf eine logzeile sendet, die auch echt gespeichert ist, bevor der kritische aufruf ausgeführt wird.<br />
das dauernde öffnen und schließen mag performance kosten. vielleicht reicht auch offenhalten und nach jeder zeile flushen. vielleicht auch nur fluschen in einem bestimmten loglevelbereich.<br />
sollte trotzdem das logging wegen des flushens zu lahm sein, ist es natürlich angebracht, das flushen doch wegzumachen. oder, wenn man ein wenig zeit hat, loggt man einfach nicht in eine datei, sondern in eine pipe eines parallel gestarteten programms. das andere programm kann nicht vom sterbenden prog runtergezogen werden, weshalb es nie flushen muss. vielleicht startet der loggende prozess den pipe-to-file-prozess beim start und zwar so, daß der pipe-to-file-prozess nicht child ist, sondern am leben bleibt, wenn der loggende prozess stirbt. und der pipe-to-file-prozess überwacht den loggenden prozess und wenn der stirbt, flusht er und begeht selbstmord. überwachen? er begeht einfach selbstmord, wenn die pipe zusammenbricht. fühlt sich schon nach füchterlich guter performance an (aber meistens den aufwand nicht wert). andererseits, sowas muss kann man ja immer wieder benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1250076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1250076</guid><dc:creator><![CDATA[volkardus]]></dc:creator><pubDate>Wed, 21 Mar 2007 20:21:14 GMT</pubDate></item></channel></rss>