<?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[[Gelöst] Designfrage - output operator für private member]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab eine kleine Aufgabe einfach zum Spaß bearbeitet (sie sollte eigentlich wirklich trivial sein).</p>
<p>Zuerst mal einen Name und ein Alter einlesen und ausgeben. Ok, baby einfach.<br />
Dann soll man das ganze wiederholen, indem man eine Reihe von (Name, Alter) Paaren in einer Klasse speichert. Ein/Ausgabe mit eigenen Operatoren.</p>
<p>Für die, die es interessieren sollte, der exakte Wortlaut (Englisch):</p>
<blockquote>
<p>Redo [...], storing several (name,age) pairs in a class. Doing the reading and writing using your own &gt;&gt; and &lt;&lt; operators.</p>
</blockquote>
<p>eigentlich hätte ich an sowas gedacht:</p>
<pre><code>struct NameAgePair {
    string name;
    int age;
    NameAgePair(const string&amp; n, int a)
        : name{n}, age{a} { }
};
// ... operator&lt;&lt; ... operator&gt;&gt;
int main()
{
    vector&lt;NameAgePair&gt; pairs;
    // ...
}
</code></pre>
<p>Aber ich hab es in der Aufgabe so verstanden:</p>
<pre><code>class Persons {
// ...
private:
    vector&lt;pair&lt;string, int&gt;&gt; name_age_pairs;
};
</code></pre>
<p>Und nun zu meiner Frage: Wenn ich hier Ein- bzw. Ausgabe Operatoren definieren möchte, brauch ich ja Zugriff auf die `name_age_pairs`.<br />
Den hab ich aber so erstmal nicht, da ja private. Soll ich also nun das ganze einfach public machen, dann siehts ca. so aus:</p>
<pre><code>istream&amp; operator&gt;&gt;(istream&amp; is, Persons&amp; p)
{
    // Name und Alter einlesen
    p.name_age_pairs.push_back(make_pair(name, age));
    return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, const Persons&amp; p)
{
    for (const auto&amp; i : p.name_age_pairs) {
        os &lt;&lt; &quot;Name: &quot; &lt;&lt; i.first &lt;&lt; '\n'
           &lt;&lt; &quot;Alter: &quot; &lt;&lt; i.second &lt;&lt; '\n';
    }
    return os;
}
</code></pre>
<p>Oder soll ich es private lassen, und eine `add` bzw `print` Funktion hinzufügen, die dann dementsprechend aufgerufen werden:</p>
<pre><code>// ...
public:
    void add(const pair&lt;string, int&gt;&amp; p)
    {
        name_age_pairs.push_back(p);
    }
    void print(ostream&amp; os)
    {
        for (const auto&amp; i : name_age_pairs) {
            os &lt;&lt; &quot;Name: &quot; &lt;&lt; i.first &lt;&lt; '\n'
               &lt;&lt; &quot;Age: &quot; &lt;&lt; i.second &lt;&lt; '\n';
        }
    }
// ...
istream&amp; operator&gt;&gt;(istream&amp; is, Persons&amp; p)
{
    // Name und Alter einlesen
    p.add(make_pair(name, age));
    return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, Persons&amp; p)
{
    p.print(os);
    return os;
}
</code></pre>
<p>Das mag dem Einen oder Anderen jetzt als blöde oder triviale Frage erscheinen, aber es interessiert mich wirklich, insbesondere bei so einer `print` Funktion fühle ich mir vom Bauch her etwas komisch.<br />
Wär also nett, wenn mir jemand erklären könnte auf welche Art (oder vielleicht eine ganz andere) man das besser lösen sollte.<br />
Das lässt sich dann bestimmt auch allgemein recht gut anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330111/gelöst-designfrage-output-operator-für-private-member</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 13:59:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330111.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Dec 2014 19:11:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst] Designfrage - output operator für private member on Mon, 22 Dec 2014 20:01:48 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab eine kleine Aufgabe einfach zum Spaß bearbeitet (sie sollte eigentlich wirklich trivial sein).</p>
<p>Zuerst mal einen Name und ein Alter einlesen und ausgeben. Ok, baby einfach.<br />
Dann soll man das ganze wiederholen, indem man eine Reihe von (Name, Alter) Paaren in einer Klasse speichert. Ein/Ausgabe mit eigenen Operatoren.</p>
<p>Für die, die es interessieren sollte, der exakte Wortlaut (Englisch):</p>
<blockquote>
<p>Redo [...], storing several (name,age) pairs in a class. Doing the reading and writing using your own &gt;&gt; and &lt;&lt; operators.</p>
</blockquote>
<p>eigentlich hätte ich an sowas gedacht:</p>
<pre><code>struct NameAgePair {
    string name;
    int age;
    NameAgePair(const string&amp; n, int a)
        : name{n}, age{a} { }
};
// ... operator&lt;&lt; ... operator&gt;&gt;
int main()
{
    vector&lt;NameAgePair&gt; pairs;
    // ...
}
</code></pre>
<p>Aber ich hab es in der Aufgabe so verstanden:</p>
<pre><code>class Persons {
// ...
private:
    vector&lt;pair&lt;string, int&gt;&gt; name_age_pairs;
};
</code></pre>
<p>Und nun zu meiner Frage: Wenn ich hier Ein- bzw. Ausgabe Operatoren definieren möchte, brauch ich ja Zugriff auf die `name_age_pairs`.<br />
Den hab ich aber so erstmal nicht, da ja private. Soll ich also nun das ganze einfach public machen, dann siehts ca. so aus:</p>
<pre><code>istream&amp; operator&gt;&gt;(istream&amp; is, Persons&amp; p)
{
    // Name und Alter einlesen
    p.name_age_pairs.push_back(make_pair(name, age));
    return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, const Persons&amp; p)
{
    for (const auto&amp; i : p.name_age_pairs) {
        os &lt;&lt; &quot;Name: &quot; &lt;&lt; i.first &lt;&lt; '\n'
           &lt;&lt; &quot;Alter: &quot; &lt;&lt; i.second &lt;&lt; '\n';
    }
    return os;
}
</code></pre>
<p>Oder soll ich es private lassen, und eine `add` bzw `print` Funktion hinzufügen, die dann dementsprechend aufgerufen werden:</p>
<pre><code>// ...
public:
    void add(const pair&lt;string, int&gt;&amp; p)
    {
        name_age_pairs.push_back(p);
    }
    void print(ostream&amp; os)
    {
        for (const auto&amp; i : name_age_pairs) {
            os &lt;&lt; &quot;Name: &quot; &lt;&lt; i.first &lt;&lt; '\n'
               &lt;&lt; &quot;Age: &quot; &lt;&lt; i.second &lt;&lt; '\n';
        }
    }
// ...
istream&amp; operator&gt;&gt;(istream&amp; is, Persons&amp; p)
{
    // Name und Alter einlesen
    p.add(make_pair(name, age));
    return is;
}

ostream&amp; operator&lt;&lt;(ostream&amp; os, Persons&amp; p)
{
    p.print(os);
    return os;
}
</code></pre>
<p>Das mag dem Einen oder Anderen jetzt als blöde oder triviale Frage erscheinen, aber es interessiert mich wirklich, insbesondere bei so einer `print` Funktion fühle ich mir vom Bauch her etwas komisch.<br />
Wär also nett, wenn mir jemand erklären könnte auf welche Art (oder vielleicht eine ganz andere) man das besser lösen sollte.<br />
Das lässt sich dann bestimmt auch allgemein recht gut anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434234</guid><dc:creator><![CDATA[HarteWare]]></dc:creator><pubDate>Mon, 22 Dec 2014 20:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Designfrage - output operator für private member on Mon, 22 Dec 2014 19:31:02 GMT]]></title><description><![CDATA[<p>Entweder die print-Funktion oder eine friend-Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434239</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Dec 2014 19:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Designfrage - output operator für private member on Mon, 22 Dec 2014 19:31:07 GMT]]></title><description><![CDATA[<p><a href="https://www.youtube.com/watch?v=4aDKhcsJNJA&amp;t=21s" rel="nofollow">Hmmm...</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434240</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Mon, 22 Dec 2014 19:31:07 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Designfrage - output operator für private member on Mon, 22 Dec 2014 19:32:14 GMT]]></title><description><![CDATA[<p>Du kannst die Operatoren als friend der Klasse deklarieren. Dann können sie auf private member zugreifen.</p>
<p>Die Operatoren sind zwar keine Member aber haben quasi den selben Status. Sie sind immanente Bestandteile der Klasse.</p>
<pre><code>class Persons
{
  std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Persons&amp; p);
  std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Persons&amp; p);
...
};
</code></pre>
<p>Ich empfehle übrigens immer den Präfix std:: zu verwenden. Im Header ist er sowieso notwendig da ein <code>using namespace std</code> quasi verboten ist. Konsequenterweise verwende ich ihn dann auch in der cpp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434241</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Mon, 22 Dec 2014 19:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Designfrage - output operator für private member on Mon, 22 Dec 2014 19:41:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25894">@Caligulaminus</a> <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="😃"
    /></p>
<p>Also, wenn ichs richtig verstanden habe, dann definiere ich die ganz normal,<br />
deklariere sie in meiner Klasse aber noch zusätzlich als friend, so erhalten sie Zugriff auf die private member, ca. so:</p>
<pre><code>class Foo {
public:
    friend ostream&amp; operator&lt;&lt;(ostream&amp; os, const Foo&amp; f);
    friend istream&amp; operator&gt;&gt;(istream&amp; is, Foo&amp; f);
// ...
};
ostream&amp; operator&lt;&lt; // ...
istream&amp; operator&gt;&gt; //...
</code></pre>
<p>Funktioniert soweit, vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434244</guid><dc:creator><![CDATA[HarteWare]]></dc:creator><pubDate>Mon, 22 Dec 2014 19:41:38 GMT</pubDate></item></channel></rss>