<?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[Kleine Probleme, die sehr stören^^]]></title><description><![CDATA[<p>Hallo, habe eine Klasse und ein cpp-Funktion namens rational. In der cpp-Funktion hab ich nen Konstruktor eingebaut. Das ist aber ein Typumwandlungskonstruktor. Wie genau bekomme ich den in eine Standard-default-konstruktor umgewandelt, sodass meine Funktion mit zwei Argumenten aber auch ganz ohne auskommen. Hab schon probiert das long ganz wegzulassen und stattdessen ne leere Klammer zu haben. Und dann zaehler=1 zu schreiben, dann hab ich aber das Problem das ich in der header-file und im cpp-Teil das gleiche habe. Und eins weglassen geht auch nich so einfach.</p>
<pre><code class="language-cpp">// ratio.cpp 
#include&quot;ratio.h&quot;
#include&lt;iostream&gt;
#include&lt;assert.h&gt;

rational::rational(long ganz)       // Typumwandlungskonstruktor
{
    zaehler = ganz;
    nenner = 1;
                        }

void rational::add(rational a, rational b) //Beispielfunktion
{
     zaehler = a.zaehler*b.nenner + b.zaehler*a.nenner;
     nenner  = a.nenner*b.nenner;
     kuerzen();
     }
</code></pre>
<pre><code class="language-cpp">// ratio.h
// Klasse für rationale Zahlen
#ifndef ratio_h
#define ratio_h

class rational
{

      public:
             rational()
             : zaehler(1), nenner(1)
             {}                     //inline
             rational(long);        //Typumwandlungskonstroktor

             // Abfrage inline
             long Zaehler () const {return zaehler;}
             long Nenner () const {return nenner;}
</code></pre>
<p>Dann habe ich ein weiteres Problem:<br />
Ich möchte eine public member-Funktion zu einer private Funktion machen. Wie genau stelle ich das an klappt anscheinend nicht wenn ich private vorschreibe und das in der header-Datei unter private deklariere.</p>
<pre><code class="language-cpp">// ratio.h
// Klasse für rationale Zahlen
#ifndef ratio_h
#define ratio_h

class rational
{

      public:
      // hab hier was ausgelassen

      private:
               friend rational operator+(rational, rational); 
               long zaehler, nenner;
    };
    #endif
</code></pre>
<pre><code class="language-cpp">long ggt(long x, long y)
{
     while (y)
     { long rest = x % y;
      x=y; y=rest;
      }
      return x;
}

void rational::kuerzen()
{
     int sign = 1;
     if (zaehler &lt; 0) { sign = -sign; zaehler = -zaehler;}
     if (nenner   &lt;0) { sign = -sign; nenner = - nenner;}
     long teiler=ggt(zaehler,nenner);
     zaehler = sign*zaehler/teiler;
     nenner = nenner/teiler;
}
</code></pre>
<p>Die kuerzen -Fubnktion soll private werden. So hoffe habe euch nicht erschlagen mit den Fragen und ihr könnt mir Helfen.</p>
<p>MFG Carlos</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258557/kleine-probleme-die-sehr-stören</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 09:11:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258557.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Jan 2010 08:29:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 08:29:12 GMT]]></title><description><![CDATA[<p>Hallo, habe eine Klasse und ein cpp-Funktion namens rational. In der cpp-Funktion hab ich nen Konstruktor eingebaut. Das ist aber ein Typumwandlungskonstruktor. Wie genau bekomme ich den in eine Standard-default-konstruktor umgewandelt, sodass meine Funktion mit zwei Argumenten aber auch ganz ohne auskommen. Hab schon probiert das long ganz wegzulassen und stattdessen ne leere Klammer zu haben. Und dann zaehler=1 zu schreiben, dann hab ich aber das Problem das ich in der header-file und im cpp-Teil das gleiche habe. Und eins weglassen geht auch nich so einfach.</p>
<pre><code class="language-cpp">// ratio.cpp 
#include&quot;ratio.h&quot;
#include&lt;iostream&gt;
#include&lt;assert.h&gt;

rational::rational(long ganz)       // Typumwandlungskonstruktor
{
    zaehler = ganz;
    nenner = 1;
                        }

void rational::add(rational a, rational b) //Beispielfunktion
{
     zaehler = a.zaehler*b.nenner + b.zaehler*a.nenner;
     nenner  = a.nenner*b.nenner;
     kuerzen();
     }
</code></pre>
<pre><code class="language-cpp">// ratio.h
// Klasse für rationale Zahlen
#ifndef ratio_h
#define ratio_h

class rational
{

      public:
             rational()
             : zaehler(1), nenner(1)
             {}                     //inline
             rational(long);        //Typumwandlungskonstroktor

             // Abfrage inline
             long Zaehler () const {return zaehler;}
             long Nenner () const {return nenner;}
</code></pre>
<p>Dann habe ich ein weiteres Problem:<br />
Ich möchte eine public member-Funktion zu einer private Funktion machen. Wie genau stelle ich das an klappt anscheinend nicht wenn ich private vorschreibe und das in der header-Datei unter private deklariere.</p>
<pre><code class="language-cpp">// ratio.h
// Klasse für rationale Zahlen
#ifndef ratio_h
#define ratio_h

class rational
{

      public:
      // hab hier was ausgelassen

      private:
               friend rational operator+(rational, rational); 
               long zaehler, nenner;
    };
    #endif
</code></pre>
<pre><code class="language-cpp">long ggt(long x, long y)
{
     while (y)
     { long rest = x % y;
      x=y; y=rest;
      }
      return x;
}

void rational::kuerzen()
{
     int sign = 1;
     if (zaehler &lt; 0) { sign = -sign; zaehler = -zaehler;}
     if (nenner   &lt;0) { sign = -sign; nenner = - nenner;}
     long teiler=ggt(zaehler,nenner);
     zaehler = sign*zaehler/teiler;
     nenner = nenner/teiler;
}
</code></pre>
<p>Die kuerzen -Fubnktion soll private werden. So hoffe habe euch nicht erschlagen mit den Fragen und ihr könnt mir Helfen.</p>
<p>MFG Carlos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837310</guid><dc:creator><![CDATA[carlosmexiko]]></dc:creator><pubDate>Tue, 12 Jan 2010 08:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 08:43:00 GMT]]></title><description><![CDATA[<p>Erschlagen nicht, aber du drückst dich völlig unklar aus.</p>
<p>carlosmexiko schrieb:</p>
<blockquote>
<p>Hallo, habe eine Klasse und ein cpp-Funktion namens rational.</p>
</blockquote>
<p>Was verstehst du unter einer cpp-Funktion? Meinst du eine cpp-Datei? Ich seh zumindest keine Funktion die rational heißt.</p>
<blockquote>
<p>In der cpp-Funktion hab ich nen Konstruktor eingebaut. Das ist aber ein Typumwandlungskonstruktor. Wie genau bekomme ich den in eine Standard-default-konstruktor umgewandelt, sodass meine Funktion mit zwei Argumenten aber auch ganz ohne auskommen.<br />
Hab schon probiert das long ganz wegzulassen und stattdessen ne leere Klammer zu haben. Und dann zaehler=1 zu schreiben, dann hab ich aber das Problem das ich in der header-file und im cpp-Teil das gleiche habe. Und eins weglassen geht auch nich so einfach.</p>
</blockquote>
<p>Wie meinen? was hast du probiert? Wenn du das long weglässt, hast du einen default-Konstruktor. Und der hat keine Argumente. Mit zwei Argumenten wäre es kein default-Konstruktor. Und du solltest auf jeden Fall die Funktionen die du im Header deklarierst in der cpp-Datei auch definieren. In beidem das gleiche zu haben ist also genau richtig und nicht ein Problem. oder was meintest du?<br />
Wenn du dein Objekt mit zwei oder garkeinem Argument konstruieren können willst brauchst du halt zwei Konstruktoren. Oder du machst default-Argumente, dann kannst du den selben Konstruktor für die Konstruktion mit 0, einem und zwei Argumenten benutzen.</p>
<blockquote>
<p>Dann habe ich ein weiteres Problem:<br />
Ich möchte eine public member-Funktion zu einer private Funktion machen. Wie genau stelle ich das an klappt anscheinend nicht wenn ich private vorschreibe und das in der header-Datei unter private deklariere.</p>
</blockquote>
<p>Doch das klappt. Zeig uns den Code mit dem du es versucht hast, dann kann man dir auch sagen was falsch dran ist.</p>
<blockquote>
<p>Die kuerzen -Fubnktion soll private werden.</p>
</blockquote>
<p>Dann schreib sie in den private-Teil in der Klasendeklaration im header, so wie du gesagt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837323</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 12 Jan 2010 08:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 08:51:38 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort.<br />
Sry meinte natürlich habe ne Klasse namens rational.<br />
Genau ich brauch nen Konstruktor, denn ich mit zwei aber auch ganz ohne Argumente nutzen kann. Kannst du mir das einmal bitte mit den default-Argumenten erklären, genau das brauche ich dann wohl.<br />
Habe das mit der private Funktion wie folgt probiert:<br />
In der cpp-Datei:</p>
<pre><code class="language-cpp">long ggt(long x, long y) // Hilfsfunktion für kuerzen()
{
     while (y)
     { long rest = x % y;
      x=y; y=rest;
      }
      return x;
}

private void rational::kuerzen()
{
     int sign = 1;
     if (zaehler &lt; 0) { sign = -sign; zaehler = -zaehler;}
     if (nenner   &lt;0) { sign = -sign; nenner = - nenner;}
     long teiler=ggt(zaehler,nenner);
     zaehler = sign*zaehler/teiler;
     nenner = nenner/teiler;
}
</code></pre>
<p>Und in der header-Datei:</p>
<pre><code class="language-cpp">private:
               void kurzen();
               long zaehler, nenner;
</code></pre>
<p>MFG Carlos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837332</guid><dc:creator><![CDATA[CarlosMexiko]]></dc:creator><pubDate>Tue, 12 Jan 2010 08:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 09:32:26 GMT]]></title><description><![CDATA[<blockquote>
<p>Genau ich brauch nen Konstruktor, denn ich mit zwei aber auch ganz ohne Argumente nutzen kann.</p>
</blockquote>
<p>Wie bei jeder anderen Funktion, kannst du default Werte folgendermaßen angeben:</p>
<pre><code class="language-cpp">int foo(int val1 = 5, int val2 = 10);

foo(); // val1 = 5, val2 = 10
foo(2); // val1 = 2, val2 = 10
foo(2, 1); // val1 = 2, val2 = 1
</code></pre>
<p>MfG,<br />
ScRaT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837356</guid><dc:creator><![CDATA[bnz]]></dc:creator><pubDate>Tue, 12 Jan 2010 09:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 09:36:45 GMT]]></title><description><![CDATA[<p>Wenn du einen Konstruktor mit und ohne Argumenten benutzen willst, muss in der Klassen deklaration den Konstruktor vorbelegen mit 0,</p>
<pre><code>class myClass
{
  public:

    myClass(int a=0, int b=0); /
    ....
};
</code></pre>
<p>In der definition brauchst du die belegung nicht mit zu übernehmen.<br />
die kommt nur in die deklaration, jetzt kannst du dann Konstruktor sowohl ohne als auch mit argumenten verwenden!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837359</guid><dc:creator><![CDATA[SocketMaster]]></dc:creator><pubDate>Tue, 12 Jan 2010 09:36:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 09:53:31 GMT]]></title><description><![CDATA[<blockquote>
<p>ich mit zwei aber auch ganz ohne Argumente nutzen kann</p>
</blockquote>
<p>Schreib zwei Konstruktoren, nennt sich Ueberladung. Das funktioniert auch bei allen anderen Funktionen/Methoden. Ich persoenlich halte nicht viel von default-Parametern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837370</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 12 Jan 2010 09:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 10:06:15 GMT]]></title><description><![CDATA[<p>CarlosMexiko schrieb:</p>
<blockquote>
<p>Habe das mit der private Funktion wie folgt probiert:<br />
In der cpp-Datei: [...]</p>
</blockquote>
<p>in der cpp-Datei gehören die Zugriffspezifizierer nicht hin, d.h. lass das private dort weg (da dürfte dir der Compiler auch eine entsprechende Fehlermeldung zu gegeben haben, die sollte man immer aufmerksam lesen!) So wie du es im Header gemacht hast ists richtig. Sollte aber auch in jedem Tutorial so zu finden sein.</p>
<p>SocketMaster schrieb:</p>
<blockquote>
<p>Wenn du einen Konstruktor mit und ohne Argumenten benutzen willst, muss in der Klassen deklaration den Konstruktor vorbelegen mit 0</p>
</blockquote>
<p>Das klingt so als ob default-argumente immer 0 sein müssten, was natürlich nicht stimmt. Gerade bei einem rational-Konstruktor würde ich das default-argument für den Nenner 1 machen, für den Zähler 0. Damit wird beim default-Ctor ein rational-Objekt mit 0/1, also 0 initialisiert (so wie die eingebauten Datentypen auch), und wenn man ein argument angibt entspricht das dem entsprechenden int, so dass man einen Umwandlungs-Konstruktor hat der genau das tut was man erwartet.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Ich persoenlich halte nicht viel von default-Parametern.</p>
</blockquote>
<p>Das ist persönlicher Geschmack, in dem Fall tun aber default-Parameter nichts böses und sparen Schreibarbeit bzw. Code-Duplikation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837380</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 12 Jan 2010 10:06:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 10:34:14 GMT]]></title><description><![CDATA[<p>Du hast die Klasse also in der Header Datei ratio.h deklariert. Ich frage mich wo die Funktionen drin stehen sollten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837402</guid><dc:creator><![CDATA[carl88]]></dc:creator><pubDate>Tue, 12 Jan 2010 10:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 10:53:19 GMT]]></title><description><![CDATA[<p>Vielen dank für die hilfreichen Beiträge!</p>
<p>MFG Carlos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837415</guid><dc:creator><![CDATA[CarlosMexiko]]></dc:creator><pubDate>Tue, 12 Jan 2010 10:53:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 11:06:36 GMT]]></title><description><![CDATA[<p>Nochmal hallo^^,<br />
möchte euch doch noch bitten mir bei einem Problem zu helfen.<br />
Und zwar geht es um das Überladen der arithmetischen Operatoren(+,-,*,/).<br />
Habe da bisher folgendes:</p>
<pre><code class="language-cpp">rational operator+(rational a, rational b)
{
         rational t;
         t.zaehler = a.zaehler*b.nenner + b.zaehler*a.nenner;
         t.nenner  = a.nenner*b.nenner;
         t.kuerzen();
         return t;
}
</code></pre>
<p>Kommt dieser Teil in die header-Datei? Und wie Implementier ich das dann in meiner CPP-Datei?</p>
<p>Was mich daran stört ist das ich nur eine Zahl eingeben möchte. Da könnte ich doch statt a.zaehler zaehler und statt a.nenner nenner schreiben, oder? Damit mein Konstruktor einspringt.</p>
<p>MFG Carlos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837428</guid><dc:creator><![CDATA[CarlosMexiko]]></dc:creator><pubDate>Tue, 12 Jan 2010 11:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to Kleine Probleme, die sehr stören^^ on Tue, 12 Jan 2010 12:48:41 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht ganz sicher, was du meinst, dass du nur eine Zahl angeben möchtest, aber ich nehme mal an, dass du die Funkion als Member einer Klasse implementieren möchtest. Warum du das besser nicht machst, kannst du im <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html" rel="nofollow">Artikel</a> nachlesen.</p>
<p>Das ganze in eine .cpp auszulagern funktioniert genau gleich, wie bei allen anderen Funktionen auch. <code>operator +</code> ist ja eigentlich nur ein Name, der ein wenig eine schönere Syntax ermöglicht. Einfach im Header deklarieren und dann kannst du die Funktion in der .cpp definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1837491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1837491</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 12 Jan 2010 12:48:41 GMT</pubDate></item></channel></rss>