<?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[Struktur übergeben oder neu initialisieren]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich habe eine Struktur namens Settings in der alle Programmeinstellungen beim Start eingelesen werden. Die Settings stehen in einer Ini-Datei. Geparst wird das ganze mit boost::spirit.</p>
<p>Jetzt benötigen jedoch andere Klassen auch die Daten aus der Ini-Datei. Derzeit läuft das bei mir so das ich immer einen Pointer der Settings Struktur durch schleife. Nun meine Frage macht das sinn sowas zu globalisieren, oder immer wieder übergeben, oder einfach neu initialisieren.</p>
<p><strong>Übergeben:</strong><br />
übergeben ist glaube ich der sauberste weg, was mir nicht gefällt wenn zum Beispiel ein Klassenauf stattfindet: A -&gt; B -&gt; C<br />
Klasse A ruft B auf und die wiederum C Wenn Klasse A und B die Settings Struktur nicht benötigt, jedoch Klasse C muss ich das kommplett durch schleifen, was ein wenig nervig ist.</p>
<p><strong>Neu initialisieren:</strong><br />
Das Problem was ich da sehe ist das die Ini-Datei immer neu geparst werden muss, nun weiß ich nicht ob das Kritisch ist oder ein Flaschenhals werden könnte. Natürlich kommt es immer auf die Größe der Datei an und wie diese geparst wird. Ist sowas sinnvoll</p>
<p><strong>Globalisierung:</strong><br />
Überall liest man das dies schlecht ist, jedoch ist es in meinem Fall Erleichterung</p>
<p>Habt Ihr eventuell eine Idee?</p>
<p>Anbei mal so eine Ini-Datei und die Struktur damit man sich mal ein Bild machen kann.</p>
<p><strong>config.ini</strong></p>
<pre><code>[global]
log_path_error=/var/log/g5server/error.log
log_level=3
running_mode=daemon

[database]
hostname=localhost
username=test
password=123
dbname=test
</code></pre>
<p><strong>Struktur:</strong></p>
<pre><code class="language-cpp">typedef struct {
    std::string running_mode;
    std::string log_path_error;
    int log_level;
} server_configuration;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/259984/struktur-übergeben-oder-neu-initialisieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 15:48:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259984.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jan 2010 12:06:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Struktur übergeben oder neu initialisieren on Sat, 30 Jan 2010 12:06:42 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>ich habe eine Struktur namens Settings in der alle Programmeinstellungen beim Start eingelesen werden. Die Settings stehen in einer Ini-Datei. Geparst wird das ganze mit boost::spirit.</p>
<p>Jetzt benötigen jedoch andere Klassen auch die Daten aus der Ini-Datei. Derzeit läuft das bei mir so das ich immer einen Pointer der Settings Struktur durch schleife. Nun meine Frage macht das sinn sowas zu globalisieren, oder immer wieder übergeben, oder einfach neu initialisieren.</p>
<p><strong>Übergeben:</strong><br />
übergeben ist glaube ich der sauberste weg, was mir nicht gefällt wenn zum Beispiel ein Klassenauf stattfindet: A -&gt; B -&gt; C<br />
Klasse A ruft B auf und die wiederum C Wenn Klasse A und B die Settings Struktur nicht benötigt, jedoch Klasse C muss ich das kommplett durch schleifen, was ein wenig nervig ist.</p>
<p><strong>Neu initialisieren:</strong><br />
Das Problem was ich da sehe ist das die Ini-Datei immer neu geparst werden muss, nun weiß ich nicht ob das Kritisch ist oder ein Flaschenhals werden könnte. Natürlich kommt es immer auf die Größe der Datei an und wie diese geparst wird. Ist sowas sinnvoll</p>
<p><strong>Globalisierung:</strong><br />
Überall liest man das dies schlecht ist, jedoch ist es in meinem Fall Erleichterung</p>
<p>Habt Ihr eventuell eine Idee?</p>
<p>Anbei mal so eine Ini-Datei und die Struktur damit man sich mal ein Bild machen kann.</p>
<p><strong>config.ini</strong></p>
<pre><code>[global]
log_path_error=/var/log/g5server/error.log
log_level=3
running_mode=daemon

[database]
hostname=localhost
username=test
password=123
dbname=test
</code></pre>
<p><strong>Struktur:</strong></p>
<pre><code class="language-cpp">typedef struct {
    std::string running_mode;
    std::string log_path_error;
    int log_level;
} server_configuration;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1847442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847442</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Sat, 30 Jan 2010 12:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur übergeben oder neu initialisieren on Sat, 30 Jan 2010 12:36:01 GMT]]></title><description><![CDATA[<p>Ganz so allgemein kann man da nicht viel dazu sagen. Sowas ist immer sehr stark vom Projekt abhängig. Im allgemeinen sollte man die Einstellungen dort abspeichern, wo sie benötigt werden. Somit kann es auch global sein, wenn es wirklich Einstellungen sind, welche von allen Klassen verwendet werden. Aber sowas ist im allgemeinen eher selten.</p>
<p>Zudem noch ein paar Fragen zu deinem Text:</p>
<p>jd schrieb:</p>
<blockquote>
<p>übergeben ist glaube ich der sauberste weg, was mir nicht gefällt wenn zum Beispiel ein Klassenauf stattfindet: A -&gt; B -&gt; C<br />
Klasse A ruft B auf und die wiederum C Wenn Klasse A und B die Settings Struktur nicht benötigt, jedoch Klasse C muss ich das kommplett durch schleifen, was ein wenig nervig ist.</p>
</blockquote>
<p>Wie rufen sich Klassen auf? Ich kann also nicht nachvollziehen, wie oder was du hier nervig findest, da es gar nicht möglich ist.</p>
<p>jd schrieb:</p>
<blockquote>
<p>Überall liest man das dies schlecht ist, jedoch ist es in meinem Fall Erleichterung</p>
</blockquote>
<p>Bis du anfängst zu Debuggen oder das Projekt warten musst. Die einzige Erleichterung, welche du wahrscheinlich hast, ist in deiner Schreibfaulheit zu finden. Schreibfaulheit sollte aber nicht das Programmdesign beeinflussen <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>jd schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef struct {
    std::string running_mode;
    std::string log_path_error;
    int log_level;
} server_configuration;
</code></pre>
</blockquote>
<p>In C++ kann man direkt schreiben:</p>
<pre><code class="language-cpp">struct server_configuration {
    std::string running_mode;
    std::string log_path_error;
    int log_level;
};
</code></pre>
<p><code>struct</code> und <code>class</code> sind in C++ äquivalent. <code>struct</code> ist einfach nur per default <code>public</code> und <code>class</code> per default <code>private</code> .<br />
Und noch eine Anmerkung zu diesem <code>struct</code> . Öffentliche Attribute sind eine GANZ SCHLECHTE Idee ausser in wenigen Ausnahmen. Dadurch geht die ganze Kapselung und somit jegliches OOP verloren.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847465</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 30 Jan 2010 12:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur übergeben oder neu initialisieren on Sat, 30 Jan 2010 13:00:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke erstmal für eine fixe Antwort. Erstmal etwas zu dem Projekt es ist eine TCP-Server Applikation, die Kommunikation läuft via XML ab, Das Programm kann mehere Clients zu lassen etc. Hier mal ein bleispiel:</p>
<pre><code class="language-cpp">class A
{
	public:
		A(server_settings* settings) {}
		void god_mode() { b.get_request(); }
	private:
		server_settings* settings_;
		B b_;
}

class B
{
	public:
		void get_request() { c.handle_request(); }
	private:
		C c_;
}

class C
{
	public:
		C() {}
		C(server_settings* settings) {}
		void handle_request() {}
	private:
		server_settings* settings_;
}

int main()
{
	server_settings settings = server_settings::parse_config(&quot;config.ini&quot;);
	A a(&amp;settings);
	return 0;
}
</code></pre>
<p>Wenn ich nun server_settings in der Klasse C haben will, muss es Klasse B auch haben, damit ich das durch schleifen kann, oder ich initialisiere die Struktur neu und somit wird die config file auch neu geparst was ich eigentlich nicht will.</p>
<p>Mir kommt das irgendwie unüberlegt vor wenn die Struktur immer mit schleife, eventuell irre ich mich auch.</p>
<p>Würde mir das Singleton-Pattern helfen? Wenn es nur eine Instanz im Programmablauf geben darf und ich diese mit new auf den Heap schmeiße, sollte quasi die Config nur einmal geparst werden. Somit brauche ich 1. nicht durch schleifen und 2. Kann einfach mir die Vorhandene Instanz in der Klasse, wo ich es benötige hohlen. Wäre das eine vertretbare Option?</p>
<p>Dravere schrieb:</p>
<blockquote>
<p><code>struct</code> und <code>class</code> sind in C++ äquivalent. <code>struct</code> ist einfach nur per default <code>public</code> und <code>class</code> per default <code>private</code> .<br />
Und noch eine Anmerkung zu diesem <code>struct</code> . Öffentliche Attribute sind eine GANZ SCHLECHTE Idee ausser in wenigen Ausnahmen. Dadurch geht die ganze Kapselung und somit jegliches OOP verloren.</p>
</blockquote>
<p>Das habe ich auch noch vor das einmal zu überdenken und zu überarbeiten <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>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847477</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Sat, 30 Jan 2010 13:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Struktur übergeben oder neu initialisieren on Sat, 30 Jan 2010 13:10:42 GMT]]></title><description><![CDATA[<p>jd schrieb:</p>
<blockquote>
<p>Wenn ich nun server_settings in der Klasse C haben will, muss es Klasse B auch haben, damit ich das durch schleifen kann, oder ich initialisiere die Struktur neu und somit wird die config file auch neu geparst was ich eigentlich nicht will.</p>
<p>Mir kommt das irgendwie unüberlegt vor wenn die Struktur immer mit schleife, eventuell irre ich mich auch.</p>
</blockquote>
<p>Du brauchst <code>server_settings</code> ja in <code>B</code> nicht zu speichern. Eine Parameterübergabe im Konstruktor reicht.</p>
<pre><code class="language-cpp">A::A(server_settings* settings)
: settings_(settings)
, b_(settings)
{
}

B::B(server_settings* settings)
: c_(settings)
{
}

C::C(server_settings* settings)
: settings_(settings)
{
}
</code></pre>
<p>jd schrieb:</p>
<blockquote>
<p>Würde mir das Singleton-Pattern helfen? Wenn es nur eine Instanz im Programmablauf geben darf und ich diese mit new auf den Heap schmeiße, sollte quasi die Config nur einmal geparst werden. Somit brauche ich 1. nicht durch schleifen und 2. Kann einfach mir die Vorhandene Instanz in der Klasse, wo ich es benötige hohlen. Wäre das eine vertretbare Option?</p>
</blockquote>
<p>Grundsätzlich ist das eine Möglichkeit, allerdings ist ein Singleton nur eine objektorientierte globale Variable und bringt einige Probleme mit sich (beispielsweise, wenn es um Zerstörung bei Abhängigkeiten zu anderen Klassen geht). In deinem Beispiel ist es ja wirklich kein Problem, die Variable mitzutragen. Nur deswegen würde ich die Nachteile von Singletons nicht in Kauf nehmen wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847486</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 30 Jan 2010 13:10:42 GMT</pubDate></item></channel></rss>