<?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[Funktionen in Klasse Gruppieren]]></title><description><![CDATA[<p>Hallo.</p>
<p>Meine Klassen werden langsam sehr groß und unübersichtlich, obwohl ich Funktionen wenn möglich als private definiere.</p>
<p>Eine Klasse sieht z.B. (vereinfacht) so aus:</p>
<pre><code>class CVariable{
    public:
        CVariable(){}

        /*Functions for gradient calculation*/
        public void CalcGradientLeastSquare();
        public void CalcGradientGreenGaussNodeBased();
        public void CalcGradientGreenGaussCellBased();
        /*...u.v.m...*/

        /*Functions for node values*/
        public double GetExternalNodeValue(TNode* N);
        public double GetInternalNodeValueInverseDistance(TNode* N);
        public double GetInternalNodeValueVolumeWeighted(TNode* N);
        /*...u.v.m...*/
};
</code></pre>
<p>Frage: Ist es möglich, die Funktionen zu gruppieren? Alle Funktionen für Gradienten würde ich dann in eine Gruppe GradientFunctions und alle für Knotenwerte in NodalFunctions packen. Der Aufruf würde dann in etwa so aussehen:</p>
<pre><code>CVariable* V = new CVariable();
double x = .0;

V-&gt;GradientFunctions.CalcGradientLeastSquare();
x = V-&gt;NodalFunctions.GetExternalNodeValue(N);
/*Usw. ....*/
</code></pre>
<p>Vielen Dank für Anregungen. Mit dem namespace habe - zumindest ich - es nicht hin bekommen. Auch &quot;Nested class&quot; scheitert irgendwie.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/340423/funktionen-in-klasse-gruppieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 01:27:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/340423.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Nov 2016 17:50:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionen in Klasse Gruppieren on Mon, 07 Nov 2016 17:50:10 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Meine Klassen werden langsam sehr groß und unübersichtlich, obwohl ich Funktionen wenn möglich als private definiere.</p>
<p>Eine Klasse sieht z.B. (vereinfacht) so aus:</p>
<pre><code>class CVariable{
    public:
        CVariable(){}

        /*Functions for gradient calculation*/
        public void CalcGradientLeastSquare();
        public void CalcGradientGreenGaussNodeBased();
        public void CalcGradientGreenGaussCellBased();
        /*...u.v.m...*/

        /*Functions for node values*/
        public double GetExternalNodeValue(TNode* N);
        public double GetInternalNodeValueInverseDistance(TNode* N);
        public double GetInternalNodeValueVolumeWeighted(TNode* N);
        /*...u.v.m...*/
};
</code></pre>
<p>Frage: Ist es möglich, die Funktionen zu gruppieren? Alle Funktionen für Gradienten würde ich dann in eine Gruppe GradientFunctions und alle für Knotenwerte in NodalFunctions packen. Der Aufruf würde dann in etwa so aussehen:</p>
<pre><code>CVariable* V = new CVariable();
double x = .0;

V-&gt;GradientFunctions.CalcGradientLeastSquare();
x = V-&gt;NodalFunctions.GetExternalNodeValue(N);
/*Usw. ....*/
</code></pre>
<p>Vielen Dank für Anregungen. Mit dem namespace habe - zumindest ich - es nicht hin bekommen. Auch &quot;Nested class&quot; scheitert irgendwie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2514433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2514433</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Mon, 07 Nov 2016 17:50:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen in Klasse Gruppieren on Mon, 07 Nov 2016 18:35:23 GMT]]></title><description><![CDATA[<p>&quot;Scheitert irgendwie&quot; - ja dann machst du irgendwie etwas falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2514439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2514439</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 07 Nov 2016 18:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen in Klasse Gruppieren on Mon, 07 Nov 2016 18:35:25 GMT]]></title><description><![CDATA[<p>sieht so aus, als würdest du aus einer anderen sprache kommen.<br />
in C++ ist es häufig üblich, funktionen, die gar nicht auf die interna einer klasse zugreifen müssen, auch nicht als elementfunktionen (&quot;methoden&quot;) zu definieren, sondern als freistehende funktionionen. auch etwa so etwas wie <code>operator+</code> .</p>
<p>wenn du z.b. aus Java kommst, ist das sicherlich ungewohnt, das kommt aber mit der zeit - erinnere dich einfach immer an die frage &quot;kann ich xy nicht besser als freie funktion implementieren?&quot;</p>
<pre><code class="language-cpp">class Variable {
//...
};

double calculate_something (const Variable&amp;);
</code></pre>
<p>das ist zwar schon alt, aber immer noch ganz gut: <a href="http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197" rel="nofollow">http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197</a></p>
<p>wenn du dann immer noch viele (private) funktionen hast, überlege dir, welche davon teil des interfaces für das jeweilige &quot;modul&quot; sind - also was davon soll in den header? du machst - mit deinem header - sozusagen ein commitment, das womöglich auch längerfristig ist: diese funktionen stelle ich allen zur verfügung - und die solltest du dann auch in zukunft unterstützen. auch wenn du der einzige bist, der den code jemals &quot;verwendet&quot;, ist so ein gedanke nicht schlecht (für dich selbst). die &quot;anderen&quot; funktionen kannst du in der implementierenden datei in einem unbenannten namespace definieren:</p>
<pre><code class="language-cpp">//x.cpp
namespace {
   void foo () { //sichtbar nur in dieser übersetzungseinheit
    //...
   }
}
</code></pre>
<p>- aber das ist nur eine von vielen möglichkeiten.</p>
<p>generell sieht es so aus, als müsste sich deine CVariable um zu viel verschiedenes kümmern. ohne genau zu wissen, worum es geht wirkt etwa das:</p>
<pre><code class="language-cpp">void CalcGradientLeastSquare();
 void CalcGradientGreenGaussNodeBased();
 void CalcGradientGreenGaussCellBased();
</code></pre>
<p>nach überflüssiger wiederholung desselben codes und schreit nach einer verallgemeinerung wie etwa - etwa nur *eine* funktion <code>CalcGradient</code> , der man als parameter ein funktionsobjekt übergibt, das festlegt, wie der gradient berechnet wird. sozusagen aus &quot;GreenGaussNodeBased&quot; und &quot;GreenGaussCellBased&quot; jeweils eigene &quot;policy&quot;-klassen machen, die das verhalten von CalcGradient spezifizieren. wie gesagt, nur als beispiel ohne genau zu wissen, was du tust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2514440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2514440</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Mon, 07 Nov 2016 18:35:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen in Klasse Gruppieren on Mon, 07 Nov 2016 18:58:27 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Genau so mache ich es auch.</p>
<pre><code>class CVariable{
    private:
        void CalcGradientLeastSquare();
        void CalcGreenGaussNodeBased();
        void CalcGreenGaussCellBased();

    public:
        public CVariable(){}

        public CalcGradient(GradientTypeENUM Type = GradientTypeENUM::LeastSquare){
            switch(Type){
                case GradientTypeENUM::LeastSquare:
                    CalcGradientLeastSquare();
                    break;
                case GradientTypeENUM::GreenGaussNodal:
                    CalculateGradientNodeBased();
                default:
                    CalculateGradientGreenGaussCellBased();
                    break;
            }
        }
};
</code></pre>
<p>Aber erstens muss ich viel innerhalb von CVariable programmieren, so dass ich die Private-Funktionen immernoch sehe. Zweitens - ja - die Klasse CVariable ist sehr mächtig. Ich muss, glaub mir das einfach, alle Funktionen dort behalten bzw. wenn ich sie auslagere, wird es für mich noch unübersichtlicher. Es ist einfach sehr bequem am Ende im eigentlichen Programmablauf Variable.CalcGradient() zu schreiben.</p>
<p>Also, ich entnehme Deiner Antwort, dass das wohl nicht geht weiter zu gruppieren.</p>
<p>Und ja: Ich programmiere die GUI in C# und den Kernel (eine DLL) in C++. Kann schon sein, dass ich da ab und an mal durcheinander komme. Aber genau daher kommen eben auch meine vielen Funktionen, da ich sehr viele Werte in der Klasse habe und für alle brauche ich eine GetWert() und eine SetWert() Funktion. Auf diese greife ich dann von C# aus über den InteroptService zu:</p>
<pre><code>extern &quot;C&quot; __declspec(dllexport) int GetValue(CVariable* V){return V-&gt;GetValue();}
</code></pre>
<p>Das Programm hat schon 600 Seiten Umfang, weshalb ich da grundlegend nichts mehr ändern kann/will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2514443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2514443</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Mon, 07 Nov 2016 18:58:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen in Klasse Gruppieren on Mon, 07 Nov 2016 20:29:50 GMT]]></title><description><![CDATA[<p>Also einerseits glaube ich dem &quot;So mache ich es auch&quot; nicht, zumindest falls du dich damit auf den letzten Absatz von doves Posting beziehen sollte. Dove hatte ja vorgeschlagen, dass das CalcGradient ein Funktionsobjekt zur Berechnung bekommt, du hast aber nur ein switch und machst die Berechnung weiterhin innherhalb deiner Mega-Klasse. Hast du so einen diesen switch noch an anderen Stellen?</p>
<blockquote>
<p>Aber erstens muss ich viel innerhalb von CVariable programmieren, so dass ich die Private-Funktionen immernoch sehe. Zweitens - ja - die Klasse CVariable ist sehr mächtig. Ich muss, glaub mir das einfach, alle Funktionen dort behalten bzw. wenn ich sie auslagere, wird es für mich noch unübersichtlicher.</p>
</blockquote>
<p>Genau das glaube ich nicht, allerdings ohne deinen Code zu kennen. Eine Klasse sollte eine Sache tun (Single-Responsibility-Prinzip), deine Klasse scheint aber viel mehr zu tun, wenn du schon gruppieren möchtest.</p>
<p>Werden auf einem Objekt eigentlich mehrere der CalcGradient*-Funktionen aufgerufen oder immer nur eine? Diese Funktionen scheinen alle 0 Parameter zu haben und returnen auch nix - sie ändern also nur State. Aber eine Gradientenberechnung hört sich für mich so an, als bräuchte sie gar keinen State zu haben.</p>
<blockquote>
<p>Es ist einfach sehr bequem am Ende im eigentlichen Programmablauf Variable.CalcGradient() zu schreiben.</p>
</blockquote>
<p>Das ist aber ja unabhängig von den anderen Dingen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2514464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2514464</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Mon, 07 Nov 2016 20:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen in Klasse Gruppieren on Mon, 07 Nov 2016 20:36:02 GMT]]></title><description><![CDATA[<p>eine möglichkeit, nach der du googlen könntest, wäre das sogenannte PIMPL-idiom.<br />
kurz, so:</p>
<pre><code class="language-cpp">class CVariable {
private:
  struct pimpl;
  std::unique_ptr&lt;pimpl&gt; impl;

public:
  //special functions (konstruktoren, auch wenn default, nur deklarieren, z.b.
  CVariable (CVariable&amp;&amp;) noexcept;

  void some_public_function();
};

//und erst in der .cpp-Datei definieren:
CVariable::CVariable (CVariable&amp;&amp;) noexcept = default;

struct CVariable::pimpl {
  Data data;

  void some_private_function () { /* ... */ }
};

void CVariable::some_public_function () {
  impl-&gt;some_private_function();
}
</code></pre>
<p>der grund, warum pimpl vielleicht nicht angebracht ist, ist, dass du mit einem anderen design insgesamt vielleicht besser aufgehoben gewesen wärst. aber das scheint jetzt wohl schon zu spät.</p>
<p>hier hast du einen überblick über verschiedene möglichkeiten von PIMPL und die pros und cons: <a href="https://herbsutter.com/gotw/_100/" rel="nofollow">https://herbsutter.com/gotw/_100/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2514467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2514467</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Mon, 07 Nov 2016 20:36:02 GMT</pubDate></item></channel></rss>