<?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[Klasse mit dem &amp;lt;&amp;lt; Operator einlesen?]]></title><description><![CDATA[<p>Habe eine Personen klasse geschrieben. Dabei musste man die &lt;&lt; und &gt;&gt; Operatoren verwänden. Mein Problem ist wie Leist man eine klasse mit dem Eingabe Operator ein?</p>
<pre><code>class Person
{
private:
	string name; 
	int age; 
public:
	Person(string n, int a):name(n), age(a) {};

	const string name2() { return name; }
	const int age2() { return age; }
};
</code></pre>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
	is&gt;&gt;P.name2(),P.age2();  // Fehler
	if(!is) return is;

	return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, Person&amp; P)
{
	return os &lt;&lt; P.name2() &lt;&lt; &quot; &quot; &lt;&lt; P.age2() &lt;&lt; endl;
}

int main()
{
	Person P1(&quot;Goofy&quot;,63);
	ostream&amp; os(cout&lt;&lt;P1);

	istream&amp; is(Person&amp; P);

	keep_window_open();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/302182/klasse-mit-dem-lt-lt-operator-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 10:55:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302182.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Apr 2012 19:13:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:13:04 GMT]]></title><description><![CDATA[<p>Habe eine Personen klasse geschrieben. Dabei musste man die &lt;&lt; und &gt;&gt; Operatoren verwänden. Mein Problem ist wie Leist man eine klasse mit dem Eingabe Operator ein?</p>
<pre><code>class Person
{
private:
	string name; 
	int age; 
public:
	Person(string n, int a):name(n), age(a) {};

	const string name2() { return name; }
	const int age2() { return age; }
};
</code></pre>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
	is&gt;&gt;P.name2(),P.age2();  // Fehler
	if(!is) return is;

	return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, Person&amp; P)
{
	return os &lt;&lt; P.name2() &lt;&lt; &quot; &quot; &lt;&lt; P.age2() &lt;&lt; endl;
}

int main()
{
	Person P1(&quot;Goofy&quot;,63);
	ostream&amp; os(cout&lt;&lt;P1);

	istream&amp; is(Person&amp; P);

	keep_window_open();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201291</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:25:06 GMT]]></title><description><![CDATA[<p>Ich nehme an du moechtest das hier:</p>
<pre><code class="language-cpp">is &gt;&gt; P.name2() &gt;&gt; P.age2();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201292</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:17:14 GMT]]></title><description><![CDATA[<p>Ja das, doch da bekomme ich folgenden Fehler:</p>
<p>3 IntelliSense: Kein &quot;&gt;&gt;&quot;-Operator stimmt mit diesen Operanden überein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201293</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:17:14 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:18:49 GMT]]></title><description><![CDATA[<p>Die Klasse hat leider keine Setter, daher musst du folgendes machen oder die Klasse abändern:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
    std::string name;
    int age;
    is &gt;&gt; name &gt;&gt; age;

    P = Person(name, age);

    return is;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201294</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:18:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:24:16 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Die Klasse hat leider keine Setter, daher musst du folgendes machen oder die Klasse abändern:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
    std::string name;
    int age;
    is &gt;&gt; name &gt;&gt; age;

    P = Person(name, age);

    return is;
}
</code></pre>
</blockquote>
<p>Das habe ich hinzugefügt, nur es will keine Eingabe annehmen, obwohl es doch aufgerufen wird.</p>
<pre><code class="language-cpp">istream&amp; is(Person&amp; P);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201297</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:30:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25519">@winux</a>: Was bedeutet der unkommentierte Code? Kannst du uns mal bitte deinen Code zeigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201300</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:30:59 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:30:13 GMT]]></title><description><![CDATA[<p>Das ganze ginge auch mit friend:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Person
{
    std::string name;
    int alter;
public:
    Person(const std::string&amp; n, int a) :
    alter(a), name(n) {}
    Person() : name(&quot;Unbekannt&quot;), alter(0) {}
    std::string Name() const { return name; }
    int Alter() const { return alter; }
    friend std::istream&amp; operator&gt;&gt;(std::istream&amp; in, Person&amp; p);
};

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const Person&amp; p)
{
    return out &lt;&lt; p.Name() &lt;&lt; &quot;, &quot; &lt;&lt; p.Alter() &lt;&lt; &quot; Jahre alt.&quot;;
}

std::istream&amp; operator&gt;&gt;(std::istream&amp; in, Person&amp; p)
{
    std::cout &lt;&lt; &quot;Name: &quot;;
    std::getline(in, p.name);
    std::cout &lt;&lt; &quot;Alter: &quot;;
    return in &gt;&gt; p.alter;
}

int main()
{
    Person p;
    std::cin &gt;&gt; p;
    std::cout &lt;&lt; p;
    return 0;
}
</code></pre>
<p>Mit friend erlaubst du dem Operator &gt;&gt;, auf private Member von Person zuzugreifen.<br />
Sollte man aber sparsam mit umgehen, da es ja die ganze Datenkapselung durchlöchert. Aber bei nem Operator &gt;&gt; kann man das ruhig machen, denke ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201302</guid><dc:creator><![CDATA[Incocnito]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:33:26 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25519">@winux</a>: Was bedeutet der unkommentierte Code? Kannst du uns mal bitte deinen Code zeigen?</p>
</blockquote>
<p>Das die Funktion aufgerufen wird.</p>
<pre><code class="language-cpp">istream&amp; is(Person&amp; P);
</code></pre>
<p>Doch es sollte dann hierher Springen:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
	string name;
	int age;
	is&gt;&gt;name&gt;&gt;age;
	P = Person(name, age);
	if(!is) return is;

	return is;
}
</code></pre>
<p>Und wenn das Programm läuft sollte es doch nach einer Eingabe fragen. Doch das macht es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201305</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 19:35:49 GMT]]></title><description><![CDATA[<p>Da wird keine Funktion aufgerufen. Da wird eine Funktion deklariert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201307</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:03:53 GMT]]></title><description><![CDATA[<p>Jetzt habe ich folgendes Problem die prüf Funktion in Konstrutor will ich arbeiten. Die Übung verlangt das man error() aufruft was ich ja gemacht habe.</p>
<pre><code>class Person
{
private:
	string name; 
	int age; 
public:
	Person(string n, int a):name(n), age(a) 
	{
		if(a &lt; 0 || a &gt; 150)
			error(&quot;Alter ist ungueltige!&quot;);
	}
	Person() : name(&quot;Unbekannt&quot;), age(0) {} 

	const string name2() { return name; }
	const int age2() { return age; }

	friend istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201309</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:07:56 GMT]]></title><description><![CDATA[<p>Und was ist jetzt deine Frage?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201311</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:11:48 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Und was ist jetzt deine Frage?</p>
</blockquote>
<p>Die frage wenn ich denn Namen eingebe und danach das alter eingebe, und bei alter eine negative Zahl oder größer als 150 eingebe müsste es doch die error Funktion ausführen weil ich ja im Konstruktor das ja definiert habe. Doch es kommt nicht. Wenn ich 789 oder -6 eingebe wird das auch ausgegeben, obwohl es ja abgefangen werden sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201315</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:11:48 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:20:03 GMT]]></title><description><![CDATA[<p>Vermutlich rufst du in deinem Stream-Operator den Konstruktor nicht auf oder nur den Kopierkonstruktor...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201320</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:38:41 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Vermutlich rufst du in deinem Stream-Operator den Konstruktor nicht auf oder nur den Kopierkonstruktor...</p>
</blockquote>
<p>Problem gelöst, habe die Prüfung auch in dem &gt;&gt; Stream geschrieben. Und jetzt funktioniert die Überprüfung auch. Ist das so gut oder gibt es eine besser Lösung dafür?</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
	cout &lt;&lt; &quot;Person und Alter eingeben&quot; &lt;&lt; endl;
	is&gt;&gt;P.name&gt;&gt;P.age;

	if(P.age &lt; 0 || P.age &gt; 150)
			error (&quot;Alter ist ungueltige!\n&quot;);

	if(!is) return is;

	return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, Person&amp; P)
{
	return os &lt;&lt; P.name2() &lt;&lt; &quot; &quot; &lt;&lt; P.age2() &lt;&lt; endl;
}

int main()
try{
	Person P1(&quot;Goofy&quot;,63);
	ostream&amp; os(cout&lt;&lt;P1);

	Person P;
	istream&amp; is(cin&gt;&gt;P);
	operator&lt;&lt;(os,P);

	keep_window_open();
}
catch (runtime_error e) {	
	cout &lt;&lt; e.what() &lt;&lt; '\n';
	keep_window_open(&quot;~&quot;);	
}
</code></pre>
<pre><code>class Person
{
private:
	string name; 
	int age; 
public:
	Person(string n, int a):name(n), age(a) 
	{
		if(age &lt; 0 || age &gt; 150)
			error (&quot;Alter ist ungueltige!&quot;);
	}
	Person() : name(&quot;Unbekannt&quot;), age(0) {}

	const string name2() { return name; }
	const int age2() { return age; }

	friend istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201335</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:43:57 GMT]]></title><description><![CDATA[<p>Ich denke, das ist OK so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201337</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 20:53:24 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Ich denke, das ist OK so.</p>
</blockquote>
<p>OK</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201338</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Thu, 12 Apr 2012 20:53:24 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Thu, 12 Apr 2012 21:49:07 GMT]]></title><description><![CDATA[<p>Da ihr mich ja scheinbar überlesen habt, wie wär's denn so?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;exception&gt;
#include &lt;locale&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

class AlterFalsch : public std::exception
{
    public:
    const char* what() const throw()
    {
        return &quot;Alter in einem ungueltigen Bereich!\n&quot;;
    }
};

class NameFalsch : public std::exception
{
    public:
    const char* what() const throw()
    {
        return &quot;Ein vollstaendiger Name muss\n-Aus Vor- und Nachnahmen bestehen\n&quot;
               &quot;-Laenger als 3 Zeichen sein\n&quot;
               &quot;-Darf keine Sonderzeichen enthalten\n&quot;;
    }
};

bool istUmlaut(char c)
{
    const char ae = 132, oe = 148, ue = 129,
               UE = 220, OE = 214, AE = 196;
    std::vector&lt;char&gt; sonderzeichen { ae, oe, ue, AE, OE, UE };
    return std::find(sonderzeichen.begin(), sonderzeichen.end(), c) != sonderzeichen.end();
}

bool nameInOrdnung(const std::string&amp; name)
{
    if(name.size() &lt; 3)
        return false;
    unsigned anzahlLeerzeichen = 0; //Ein vollstaendiger Name hat genau 1 Leerzeichen.
    for(auto i : name)
        if(!std::isalpha(i, std::locale(&quot;&quot;)) &amp;&amp; !istUmlaut(i))
        {
            if(i == ' ')
                ++anzahlLeerzeichen;
            else
                return false;
        }
    if(anzahlLeerzeichen != 1)
        return false;
    return true;
}

bool alterInOrdnung(const int&amp; alter)
{
    return alter &lt;= 150 &amp;&amp; alter &gt;= 0;
}

class Person
{
    int alter;
    std::string name;
public:
    Person(const std::string&amp; n, int a) :
    alter(a), name(n) {}
    Person() : alter(0), name(&quot;Unbekannt&quot;) {}
    std::string Name() const { return name; }
    int Alter() const { return alter; }
    friend std::istream&amp; operator&gt;&gt;(std::istream&amp; in, Person&amp; p) throw(AlterFalsch);
};

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const Person&amp; p)
{
    return out &lt;&lt; p.Name() &lt;&lt; &quot;, &quot; &lt;&lt; p.Alter() &lt;&lt; &quot; Jahre alt.&quot;;
}

template&lt;typename typ&gt;
void in(typ&amp; para, std::istream&amp; is = std::cin) //wrapper um cin fuer sichere Eingabe
{
    while(!(is &gt;&gt; para))
    {
        std::cerr &lt;&lt; &quot;Fehler bei der Eingabe!\n&quot;;
        is.clear();
        is.ignore(1000, '\n');
    }
}

std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Person&amp; p) throw(AlterFalsch)
{
    std::cout &lt;&lt; &quot;Name: &quot;;
    std::getline(is, p.name);
    if(!nameInOrdnung(p.Name()))
        throw NameFalsch();
    std::cout &lt;&lt; &quot;Alter: &quot;;
    in(p.alter, is);
    if(!alterInOrdnung(p.Alter()))
        throw AlterFalsch();
    return is;
}

int main()
{
    Person p;
    try
    {
        std::cin &gt;&gt; p;
        std::cout &lt;&lt; p;
    }
    catch(const std::exception&amp; a)
    {
        throw;
    }
    return 0;
}
</code></pre>
<p><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 />
Aber jetzt ernstgemeinte Fragen:</p>
<p>Ist das gut so? (Ich bring mir das selbst nur zum Spaß bei und andere Menschen sehen selten Code von mir, daher die Frage, kann ja sein, dass ich da was falsch gelernt hab vom Stil her). Und ich hab' festgestellt, dass bei</p>
<pre><code>std::isalpha(char, std::locale)
</code></pre>
<p>mit der Systemlocale auch Umlaute wie ö, ä und ü als false ausgewertet werden und musste mir dann diese blöde istUmlaut schreiben. Warum ist das so, ich dachte die locale wär extra für sowas da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201354</guid><dc:creator><![CDATA[Incocnito]]></dc:creator><pubDate>Thu, 12 Apr 2012 21:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Fri, 13 Apr 2012 10:28:24 GMT]]></title><description><![CDATA[<p>Incocnito schrieb:</p>
<blockquote>
<p>Sollte man aber sparsam mit umgehen, da es ja die ganze Datenkapselung durchlöchert.</p>
</blockquote>
<p>friend stärkt die Kapslung. Es vermeidet, Member oder Memberfunktionen komplett public zu machen, nur damit irgendeine andere Funktion darauf Zugriff hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201536</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Fri, 13 Apr 2012 10:58:25 GMT]]></title><description><![CDATA[<p>Naja, das kann man so aber nicht stehnlassen.<br />
Besser wäre: Friend schwächt die Datenkapselung nicht so sehr, wie es das Öffentlichmachen von eigentlich privaten Membern macht.<br />
Aber <strong>stärken</strong> tut sie sie deswegen nicht. Nur weniger schlimm halt.<br />
Und zu viel friend weißt sowieso auf ein schlechtes Design hin.<br />
In der Regel ist es besser, sich bei jedem Verwenden von friend nochmal Gedanken zu machen, ob das überhaupt passieren sollte. In diesem Fall wäre es vllt. besser, der Klasse Person eine Funktion wie <code>toString() const</code> zu verpassen, und der Operator &lt;&lt; ruft die dann einfach auf und gibt's aus.<br />
Aber das spielt hier nicht wirklich ne Rolle. In der Realität brauche ich friend so ziemlich gar nicht. Aber ist ja deine Sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201552</guid><dc:creator><![CDATA[Incocnito]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Fri, 13 Apr 2012 10:59:59 GMT]]></title><description><![CDATA[<p>Incocnito schrieb:</p>
<blockquote>
<p>In diesem Fall wäre es vllt. besser, der Klasse Person eine Funktion wie <code>toString() const</code> zu verpassen, und der Operator &lt;&lt; ruft die dann einfach auf und gibt's aus.</p>
</blockquote>
<p>Warum muss ich ein XYZ-Objekt erst in einen String umwandeln, um es ausgeben zu können? Ineffizient.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201554</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:59:59 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Fri, 13 Apr 2012 11:04:36 GMT]]></title><description><![CDATA[<p>Ja, wär zu viel Aufwand und unnötig, deswegen hab ich ja auch friend verwendet. Ich wollt' nur sagen, dass es (fast?) immer eine Alternative zu friend gibt, die nicht die Datenkapselung schwächt, und die daher zu bevorzugen ist.<br />
War mir hier nur egal und ich wollte ja nur mal zeigen, dass es auch mit friend ginge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201558</guid><dc:creator><![CDATA[Incocnito]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Fri, 13 Apr 2012 11:06:29 GMT]]></title><description><![CDATA[<p>Die Alternative wäre eine Funktion print_to(ostream&amp;) :p<br />
friend gewinnt dagegen bei mir, da es kürzer ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201561</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:06:29 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Fri, 13 Apr 2012 11:29:21 GMT]]></title><description><![CDATA[<p>Joa, mir ist Kürze nicht so wichtig wie gutes Design.<br />
Also Maßstabsgerecht natürlich.<br />
Wenn die einfache Variante deutlich kürzer ist, muss ich mir natürlich überlegen, ob's wert ist. Aber so ein Problem hatte ich bis jetzt noch nie; Wenn ich zwischen kurz oder lang entscheide, geht's da höchstens um ein paar dutzend Zeilen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> Und dann nehm' ich natürlich das hübschere, verzichte auf Sachen wie friend und tippe halt ein paar Sekunden länger.<br />
Aber wie gesagt, kann jeder machen wie er will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201569</guid><dc:creator><![CDATA[Incocnito]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Sun, 15 Apr 2012 17:46:23 GMT]]></title><description><![CDATA[<p>Incocnito schrieb:</p>
<blockquote>
<p>Da ihr mich ja scheinbar überlesen habt, wie wär's denn so?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;exception&gt;
#include &lt;locale&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

class AlterFalsch : public std::exception
{
    public:
    const char* what() const throw()
    {
        return &quot;Alter in einem ungueltigen Bereich!\n&quot;;
    }
};

class NameFalsch : public std::exception
{
    public:
    const char* what() const throw()
    {
        return &quot;Ein vollstaendiger Name muss\n-Aus Vor- und Nachnahmen bestehen\n&quot;
               &quot;-Laenger als 3 Zeichen sein\n&quot;
               &quot;-Darf keine Sonderzeichen enthalten\n&quot;;
    }
};

bool istUmlaut(char c)
{
    const char ae = 132, oe = 148, ue = 129,
               UE = 220, OE = 214, AE = 196;
    std::vector&lt;char&gt; sonderzeichen { ae, oe, ue, AE, OE, UE };
    return std::find(sonderzeichen.begin(), sonderzeichen.end(), c) != sonderzeichen.end();
}

bool nameInOrdnung(const std::string&amp; name)
{
    if(name.size() &lt; 3)
        return false;
    unsigned anzahlLeerzeichen = 0; //Ein vollstaendiger Name hat genau 1 Leerzeichen.
    for(auto i : name)
        if(!std::isalpha(i, std::locale(&quot;&quot;)) &amp;&amp; !istUmlaut(i))
        {
            if(i == ' ')
                ++anzahlLeerzeichen;
            else
                return false;
        }
    if(anzahlLeerzeichen != 1)
        return false;
    return true;
}

bool alterInOrdnung(const int&amp; alter)
{
    return alter &lt;= 150 &amp;&amp; alter &gt;= 0;
}

class Person
{
    int alter;
    std::string name;
public:
    Person(const std::string&amp; n, int a) :
    alter(a), name(n) {}
    Person() : alter(0), name(&quot;Unbekannt&quot;) {}
    std::string Name() const { return name; }
    int Alter() const { return alter; }
    friend std::istream&amp; operator&gt;&gt;(std::istream&amp; in, Person&amp; p) throw(AlterFalsch);
};

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const Person&amp; p)
{
    return out &lt;&lt; p.Name() &lt;&lt; &quot;, &quot; &lt;&lt; p.Alter() &lt;&lt; &quot; Jahre alt.&quot;;
}

template&lt;typename typ&gt;
void in(typ&amp; para, std::istream&amp; is = std::cin) //wrapper um cin fuer sichere Eingabe
{
    while(!(is &gt;&gt; para))
    {
        std::cerr &lt;&lt; &quot;Fehler bei der Eingabe!\n&quot;;
        is.clear();
        is.ignore(1000, '\n');
    }
}

std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Person&amp; p) throw(AlterFalsch)
{
    std::cout &lt;&lt; &quot;Name: &quot;;
    std::getline(is, p.name);
    if(!nameInOrdnung(p.Name()))
        throw NameFalsch();
    std::cout &lt;&lt; &quot;Alter: &quot;;
    in(p.alter, is);
    if(!alterInOrdnung(p.Alter()))
        throw AlterFalsch();
    return is;
}

int main()
{
    Person p;
    try
    {
        std::cin &gt;&gt; p;
        std::cout &lt;&lt; p;
    }
    catch(const std::exception&amp; a)
    {
        throw;
    }
    return 0;
}
</code></pre>
<p><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 />
Aber jetzt ernstgemeinte Fragen:</p>
<p>Ist das gut so? (Ich bring mir das selbst nur zum Spaß bei und andere Menschen sehen selten Code von mir, daher die Frage, kann ja sein, dass ich da was falsch gelernt hab vom Stil her). Und ich hab' festgestellt, dass bei</p>
<pre><code>std::isalpha(char, std::locale)
</code></pre>
<p>mit der Systemlocale auch Umlaute wie ö, ä und ü als false ausgewertet werden und musste mir dann diese blöde istUmlaut schreiben. Warum ist das so, ich dachte die locale wär extra für sowas da?</p>
</blockquote>
<p>Danke für deine Hilfe, nur bin ich noch nicht mit dem Lernen bei template angekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202273</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Sun, 15 Apr 2012 17:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Sun, 15 Apr 2012 17:50:09 GMT]]></title><description><![CDATA[<p>Habe einen vector &lt;Person&gt; definiert, wo man ja die Person Strukturen eingeben soll und dann wieder ausgeben.</p>
<pre><code class="language-cpp">vector &lt;Person&gt; ps;

istream&amp; operator&gt;&gt;(istream&amp; is, Person&amp; P)
{
	cout &lt;&lt; &quot;Person und Alter eingeben&quot; &lt;&lt; endl;
	while (is&gt;&gt;P.name&gt;&gt;P.age)
	ps.push_back(P.name,P.age);   // Fehler
	{
	if(P.age &lt; 0 || P.age &gt; 150)
		   error (&quot;Alter ist ungueltige!\n&quot;);
	if(!is) return is;

	for(int i = 0;i&lt;P.name.size();++i)
		switch(P.name[i])
	    {
		case ';': case ':': case '&quot;': case '\'': case '[': case ']':
		case '*': case '&amp;': case '^': case '%': case '$': case '#': 
		case '@': case '!':
			error (&quot;Ungueltiger Name!&quot;);
	    }  
	}
	return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, Person&amp; P)
{
	return os &lt;&lt; P.name2() &lt;&lt; &quot; &quot; &lt;&lt; P.age2() &lt;&lt; endl;
}

int main()
try{
	Person P1(&quot;Goofy&quot;,63);
	ostream&amp; os(cout&lt;&lt;P1);

	Person P;
	istream&amp; is(cin&gt;&gt;P);
	operator&lt;&lt;(os,P);

	keep_window_open();
}
catch (runtime_error e) {	
	cout &lt;&lt; e.what() &lt;&lt; '\n';
	keep_window_open(&quot;~&quot;);	
}
</code></pre>
<p>Zeile 7 error C2661: 'std::vector&lt;_Ty&gt;::push_back': Keine überladene Funktion akzeptiert 2 Argumente<br />
Zeile 7 IntelliSense: Keine Instanz von Überladene Funktion &quot;Vector&lt;T&gt;::push_back [mit T=Person]&quot; stimmt mit der Argumentliste überein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202275</guid><dc:creator><![CDATA[winux]]></dc:creator><pubDate>Sun, 15 Apr 2012 17:50:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse mit dem &amp;lt;&amp;lt; Operator einlesen? on Sun, 15 Apr 2012 17:57:32 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung ist doch ziemlich eindeutig... push_back(...) nimmt nur ein Argument, naemlich ein Person Argument in diesem Fall.</p>
<p>Das muss so aussehen:</p>
<pre><code class="language-cpp">ps.push_back(P);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2202279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202279</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 15 Apr 2012 17:57:32 GMT</pubDate></item></channel></rss>