<?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[Logging von Klassen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in einem größeren Projekt verschiedene Klassen mit Informationen. Wenn ein Fehler auftritt Logge ich den Inhalt der Klassen in einer Logdatei um später schauen zu können was der Fehler war. Zum Loggen gibt es in jeder Klasse eine Dump()-Funktion, das ganze sieht dann etwa so aus (Pseudocode):</p>
<pre><code>class interface
{
    std::string Dump() = 0;
};

class A : interface
{
public:
    std::string m_Blah;
    std::string m_Blub;

    std::string Dump() { return &quot;Blah: &quot; + m_Blah + &quot; Blub: &quot; + m_Blub; }
};

...
</code></pre>
<p>Das schreiben der Dump-Funktion ist aber für Klasse, die z.B. 20 Felder haben, ziemlich nervig. Fehlerträchtig wird es, wenn mal ein neues Feld dazu kommt aber nicht in der Dump-Methode eingefügt wird. Mal von dem ganzen Konvertierungsaufwand &quot;int -&gt; string&quot; usw. ganz abgesehen.</p>
<p>Gibt es eine elegantere Lösung für das Problem? Unter Java würde ich Reflections nehmen und einfach alles Dumpen was die Klasse so zu bieten hat, egal ob das alles sinnvoll ist oder nicht. Aber in C++? Wie macht ihr sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286149/logging-von-klassen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 01:46:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286149.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 May 2011 12:01:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Logging von Klassen on Wed, 04 May 2011 12:01:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in einem größeren Projekt verschiedene Klassen mit Informationen. Wenn ein Fehler auftritt Logge ich den Inhalt der Klassen in einer Logdatei um später schauen zu können was der Fehler war. Zum Loggen gibt es in jeder Klasse eine Dump()-Funktion, das ganze sieht dann etwa so aus (Pseudocode):</p>
<pre><code>class interface
{
    std::string Dump() = 0;
};

class A : interface
{
public:
    std::string m_Blah;
    std::string m_Blub;

    std::string Dump() { return &quot;Blah: &quot; + m_Blah + &quot; Blub: &quot; + m_Blub; }
};

...
</code></pre>
<p>Das schreiben der Dump-Funktion ist aber für Klasse, die z.B. 20 Felder haben, ziemlich nervig. Fehlerträchtig wird es, wenn mal ein neues Feld dazu kommt aber nicht in der Dump-Methode eingefügt wird. Mal von dem ganzen Konvertierungsaufwand &quot;int -&gt; string&quot; usw. ganz abgesehen.</p>
<p>Gibt es eine elegantere Lösung für das Problem? Unter Java würde ich Reflections nehmen und einfach alles Dumpen was die Klasse so zu bieten hat, egal ob das alles sinnvoll ist oder nicht. Aber in C++? Wie macht ihr sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058347</guid><dc:creator><![CDATA[Day]]></dc:creator><pubDate>Wed, 04 May 2011 12:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to Logging von Klassen on Wed, 04 May 2011 12:50:09 GMT]]></title><description><![CDATA[<p>1. Keine Klassen mit 20 Feldern haben. Unterteilen in (sinnvolle!) Unterklassen.<br />
2. Statt einem string gibt es einen ostream&amp; zurück. Das lässt sich wunderbar zu größeren Gebilden koppeln und mit Konvertierungen hat man in der Regel auch kein Problem.<br />
3. Oder im Fehlerfall auch mal angucken, was Debugger und Kernel dump einem verraten können. Damit kommt man oftmals auch sehr weit, ohne den ganzen Logging-Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058363</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 04 May 2011 12:50:09 GMT</pubDate></item><item><title><![CDATA[Reply to Logging von Klassen on Wed, 04 May 2011 13:01:28 GMT]]></title><description><![CDATA[<p>1. Hm aber auch bei 10 Unterklassen mit je 2 Variablen hab ich wieder das Problem das ich in jeder eine Dump-Methode implementieren muss und ja keine Variable vergessen sollte.<br />
2. Ok, macht aber auch nicht weniger Aufwand <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="😉"
    /><br />
3. Mit Fehlerfall meinte ich kein Absturz, sondern mehr sowas:</p>
<pre><code class="language-cpp">X a;

if (FAILED(TuWas(&amp;a)))
{
    LoggeInhalt(&amp;a);
}
</code></pre>
<p>Im Dumpfile sehe ich dann natürlich die Werte. Zum Glück kommt es aber nur sehr selten vor das die Anwendung crasht, öfter passiert es das eine Funktion &quot;FAILED&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058368</guid><dc:creator><![CDATA[Day]]></dc:creator><pubDate>Wed, 04 May 2011 13:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to Logging von Klassen on Wed, 04 May 2011 15:17:39 GMT]]></title><description><![CDATA[<p>Du musst die Membervariablen irgendwie auflisten, darum herum kommst du nicht. Ich würde aber <code>std::ostringstream</code> für die Konvertierung nehmen, dann ist das Ganze mit <code>&lt;&lt;</code> recht komfortabel. Für eigene Typen kannst du diesen Operator wiederum überladen, was dann ein hierarchisches Ausgeben ermöglicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058472</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 04 May 2011 15:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Logging von Klassen on Wed, 04 May 2011 16:11:23 GMT]]></title><description><![CDATA[<p>Es wäre glaube ich möglich, das ohne nochmal Tippen zu machen. Allerdings bräuchtest du dann meiner Idee nach Makros und eine Liste von Pointern auf Klassen, die Pointer auf die Member speichern und das ist nicht effektiv. Wenn du C++0x benutzen kannst, wüsste ich einen Trick zur Überprüfung, ob du alle Member berücksichtigt hast. In C++ ohne 0x nur mit komplizierten Makros oder Mehrfach-Schreibaufwand...<br />
Allerdings wirst du mit dem Loggen von Pointern oft nicht so viel anfangen können (außer die NULL-Prüfung).</p>
<p>EDIT: Mit einem ausgeklügelten Design könntest du es natürlich erreichen, dass du das Loggen (mit den Pointern in der Klasse = zusätzlichem Zeit- und Speicherverbrauch) per #define an- und ausschalten könntest und zudem den Inhalt hinter den Klassenmembern, die Pointer sind, gleich noch mitloggen könntest - aber das sollte sich dann auch wirklich lohnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058525</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 04 May 2011 16:11:23 GMT</pubDate></item></channel></rss>