<?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[Benennung von &amp;quot;Accessors&amp;quot;]]></title><description><![CDATA[<p>Hallo,<br />
gerade machte ich mir Gedanken darüber, wie ich es mit Accessor-Methoden handhaben sollte, da überkam es mich, dass ich euch ja auch mal nach euren Praktiken und den Gedanken dahinter fragen könnte.<br />
Nehmen wir mal das Beispiel von Widget und Size (man könnte Verbindungen zu meinem letzten Thread vermuten^^).<br />
Die Ausmaße des Widget-Rechtecks ist ja nunmal eine Eigenschaft dessen. Wenn man nun die beiden Klassen Size und Widget hat, dann könnte man ja zuersteinmal auf den Gedanken kommen, der Klasse Widget die Methoden SetSize und GetSize zu verpassen. Ich bin es allerdings irgendwie inzwischen Leid geworden, da gesondert zu entscheiden. Also könnte ich ja auch verschiedene Überladungen der Methode Size bei Widget deklarieren. Allerdings führt das erstmal zu einer Namenskollision, die man nun auf zwei verschiedene Weisen lösen könnte. Man könnte erstmal alle Klassennamen (oder zumindest die simplen Klassen, die gern als Eigenschaften hergenommen werden) mit kleinen Anfangsbuchstaben bennenen. Andererseits könnte man bei den Accessor-Deklaration immer auf Namespace-Spezifizierer setzen, um die Kollision zu verhindern.<br />
Hier mal die drei Wege gegenüber gestellt:</p>
<pre><code class="language-cpp">namespace vis {

    // Variante A
    class Size;

    class Widget {
    public:
        void SetSize( const Size&amp; );
        Size GetSize() const;
    };

    // Variante B
    class size;

    class Widget {
    public:
        void Size( const size&amp; );
        size Size() const;
    };

    //Variante C
    class Size;

    class Widget {
    public:
        void Size( const vis::Size&amp; );
        vis::Size Size() const;
    };
}
</code></pre>
<p>Nun machen in der letzten Variante natürlich die Namespace-Spezifizierer die Sache etwas &quot;unübersichtlicher&quot;. Dennoch würde ich sie im Moment bevorzugen, weil sie einfach immer funktioniert, genau wie die Get- und Set-Methoden. Was sagt ihr? Gibt es vielleicht noch andere Wege?</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279089/benennung-von-quot-accessors-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 02:04:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279089.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Dec 2010 23:33:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sat, 18 Dec 2010 23:37:15 GMT]]></title><description><![CDATA[<p>Hallo,<br />
gerade machte ich mir Gedanken darüber, wie ich es mit Accessor-Methoden handhaben sollte, da überkam es mich, dass ich euch ja auch mal nach euren Praktiken und den Gedanken dahinter fragen könnte.<br />
Nehmen wir mal das Beispiel von Widget und Size (man könnte Verbindungen zu meinem letzten Thread vermuten^^).<br />
Die Ausmaße des Widget-Rechtecks ist ja nunmal eine Eigenschaft dessen. Wenn man nun die beiden Klassen Size und Widget hat, dann könnte man ja zuersteinmal auf den Gedanken kommen, der Klasse Widget die Methoden SetSize und GetSize zu verpassen. Ich bin es allerdings irgendwie inzwischen Leid geworden, da gesondert zu entscheiden. Also könnte ich ja auch verschiedene Überladungen der Methode Size bei Widget deklarieren. Allerdings führt das erstmal zu einer Namenskollision, die man nun auf zwei verschiedene Weisen lösen könnte. Man könnte erstmal alle Klassennamen (oder zumindest die simplen Klassen, die gern als Eigenschaften hergenommen werden) mit kleinen Anfangsbuchstaben bennenen. Andererseits könnte man bei den Accessor-Deklaration immer auf Namespace-Spezifizierer setzen, um die Kollision zu verhindern.<br />
Hier mal die drei Wege gegenüber gestellt:</p>
<pre><code class="language-cpp">namespace vis {

    // Variante A
    class Size;

    class Widget {
    public:
        void SetSize( const Size&amp; );
        Size GetSize() const;
    };

    // Variante B
    class size;

    class Widget {
    public:
        void Size( const size&amp; );
        size Size() const;
    };

    //Variante C
    class Size;

    class Widget {
    public:
        void Size( const vis::Size&amp; );
        vis::Size Size() const;
    };
}
</code></pre>
<p>Nun machen in der letzten Variante natürlich die Namespace-Spezifizierer die Sache etwas &quot;unübersichtlicher&quot;. Dennoch würde ich sie im Moment bevorzugen, weil sie einfach immer funktioniert, genau wie die Get- und Set-Methoden. Was sagt ihr? Gibt es vielleicht noch andere Wege?</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996452</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 18 Dec 2010 23:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 00:08:27 GMT]]></title><description><![CDATA[<p>Ich finde Klassen sollte man gross schreiben, aber Funktionen nicht (unbedingt).<br />
Daher wäre ich -wenn ich wählen müsste- für Variante B2.</p>
<pre><code class="language-cpp">// Variante B2
    class Size;

    class Widget {
    public:
        void size( const Size&amp; );
        Size size() const;
    };
</code></pre>
<p>Aber irgendwie hab ich das Problem nie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996459</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Sun, 19 Dec 2010 00:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 01:43:22 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Wenn man nun die beiden Klassen Size und Widget hat, dann könnte man ja zuersteinmal auf den Gedanken kommen, der Klasse Widget die Methoden SetSize und GetSize zu verpassen. Ich bin es allerdings irgendwie inzwischen Leid geworden, da gesondert zu entscheiden. Also könnte ich ja auch verschiedene Überladungen der Methode Size bei Widget deklarieren.</p>
</blockquote>
<p>Ich persönlich sehe bei &quot;Set&quot; und &quot;Get&quot; schneller, was getan wird, ausserdem bleibe ich der Linie &quot;beschreibe Funktionen als Verben&quot; etwas treuer <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>Demnach würde ich zu Variante A tendieren. Wobei du dir auch überlegen sollst, ob die Setter/Getter wirklich immer notwendig sind. Wenn man damit nur immer eine Aktion durchführt, kann man vielleicht auch eine spezialisierte Methode anbieten. Oder du nimmst zur Abwechslung Bezeichner wie &quot;Resize&quot;, was aber schnell mal inkonsistent wird. Gerade wenn man anfängt, &quot;Move&quot; statt &quot;SetPosition&quot; zu verwenden, übertrifft die Verwirrung so langsam den Nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996467</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 01:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 02:19:16 GMT]]></title><description><![CDATA[<p>Heyho,<br />
vielen Dank schon einmal euch beiden, für eure Beiträge.<br />
An Jockel gesondert: Wie genau kommt es, dass du solche Situation noch nicht hattest? Ich kann mir das gar nicht vorstellen!<br />
Also ich eben nochmal nach Alternativen gesucht habe, ist mir aufgefallen, dass man das ganze ja auf seine Grundidee reduzieren könnte, nämlich dass dort in dem Objekt eine Eigenschaft existiert, die durch eine Klasse hinreichend beschrieben wird. Ein Widget hat eine Ausdehnung (Size), wie viele andere Dinge auch. Wenn man sich nun ein Accessor-Template-Objekt basteln würde, nach dem Motto:</p>
<pre><code class="language-cpp">template&lt; typename T &gt; class Accessor { /* ... */ };

class Size;

class Widget {
public:
     Accessor&lt;vis::Size&gt; Size;

private:
     vis::Size size_;
};
</code></pre>
<p>,<br />
könnte man sozusagen auf diese Eigenschaft so zugreifen, wie ich mir das - zumindest im ersten Moment - eigentlich vorstellen würde:</p>
<pre><code class="language-cpp">Widget some;
some.Size = vis::Size(10,10);
vis::Size someSize = some.Size;
</code></pre>
<p>Wobei der Accessor dann entweder Direktzugriff macht, oder das auf versteckte Methoden oder Funktionen mapt. Der Großbuchstabe des Members bei der Zuweisung würde auch direkt anzeigen, dass es sich um einen Accessor handelt, da ich ansonsten Membervariablen immer klein schreibe.<br />
Das würde auch wunderbar zu &quot;Named Properties&quot; passen, wenn man den Accessors sagt, dass sie sich irgendwo zentral unter bestimmten Namen registrieren sollen... Was man damit nicht alles anstellen könnte^^<br />
Schade nur, dass ich selbst für den Direktmodus im Moment keinen Weg sehe, das ohne Indirektion (sei es über Zeiger auf size_ oder sonstwie) umzusetzen.</p>
<p>Tagträumerei?^^ Edit: Nachtträumerei?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996470</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 02:19:16 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 02:30:56 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>An Jockel gesondert: Wie genau kommt es, dass du solche Situation noch nicht hattest? Ich kann mir das gar nicht vorstellen!</p>
</blockquote>
<p>Wahrscheinlich meinte er, dass ihm 0815-Setter und -Getter bisher meist gereicht haben. Das geht mir ähnlich. Ich hab zwar auch schon Artikel gelesen, die Setter/Getter verdammen und eine Alternative (war glaub ich was mit Funktoren) heilig sprechen. Aber so wirklich hat mich das bisher nie überzeugt.</p>
<p>Decimad schrieb:</p>
<blockquote>
<p>Schade nur, dass ich selbst für den Direktmodus im Moment keinen Weg sehe, das ohne Indirektion (sei es über Zeiger auf size_ oder sonstwie) umzusetzen.</p>
</blockquote>
<p>Wie wärs, wenn du die Membervariable direkt öffentlich machst?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Accessor
{
    public:
        // Schnittstelle, um Property zu simulieren
        // d.h. Zuweisungs- und Konvertierungsoperator etc.
    private:
        T value;
};

class Widget
{
    public:
        Accessor&lt;vis::Size&gt; Size;

    private:
        // nichts
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1996472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996472</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 02:30:56 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 02:38:31 GMT]]></title><description><![CDATA[<p>Bam, na klar, für den Direktmodus habe ich da wieder zu kompliziert gedacht, danke dass du mich da auf den Boden zurückgeholt hast, hehehe.<br />
Allerdings ist es ja nun so, dass z.B. die Veränderung der Ausdehnung eines Widgets natürlich größere Auswirkungen auf den Rest haben (das ist ja der interessante Punkt und überhaupt der Hauptgrund um die Member, so sie denn in der direkten Form existieren, zu verstecken) und der Direktmodus damit ausfällt. In dem Fall würde man ja mit some.Size erstmal den Kontext &quot;weg-punkten&quot; und damit muss Size den Kontext intern gespeichert haben, beispielsweise durch einen Zeiger auf das beinhaltende Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996473</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 02:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 02:49:21 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Allerdings ist es ja nun so, dass z.B. die Veränderung der Ausdehnung eines Widgets natürlich größere Auswirkungen auf den Rest haben (das ist ja der interessante Punkt und überhaupt der Hauptgrund um die Member, so sie denn in der direkten Form existieren, zu verstecken) und der Direktmodus damit ausfällt.</p>
</blockquote>
<p>Du kannst ja dem <code>Accessor</code> Funktionalität mitgeben, falls nötig. Z.B. mit <code>std::tr1::function</code> , aber keine Ahnung, ob das drin liegt. Da <code>Accessor</code> ein Template ist, könntest du unter Umständen sogar (Member-)Funktionszeiger als Template-Parameter fest verdrahten.</p>
<p>Diese Properties in C++ sind jedenfalls ein interessantes Experiment <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<p>Wie würdest du denn umgekehrt die Funktionalität einbauen, wenn der Accessor nur eine Indirektion auf den Member wäre? Und was stört dich dabei an den Zeigern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996474</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 02:49:21 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 02:53:39 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Decimad schrieb:</p>
<blockquote>
<p>An Jockel gesondert: Wie genau kommt es, dass du solche Situation noch nicht hattest? Ich kann mir das gar nicht vorstellen!</p>
</blockquote>
<p>Wahrscheinlich meinte er, dass ihm 0815-Setter und -Getter bisher meist gereicht haben.</p>
</blockquote>
<p>Ja. Ich finde diese C#-Properties zwar sehr nett, aber da das in C++ so nicht vorgesehen ist, versuche ich das nicht irgendwie nachzubauen.<br />
Also sind meine getter/setter normale Funktionen und die tuen was und sind daher Verben: getXY/setXY.<br />
(Ich dachte diese Variante dürfte man aber nicht nennen, da du die nicht haben willst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996475</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Sun, 19 Dec 2010 02:53:39 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 03:08:55 GMT]]></title><description><![CDATA[<p>Ganz im Gegenteil, Jockel. Das ist doch eine ziemliche Geschmackssache und niemand kann einem sagen, dass einem das schönste Paar Schuhe aus Geschäft 1 noch gefällt, wenn man in ihnen vor Geschäft 2 steht. Darum freue ich mich über jede Ansicht, derer ich in diesem Belang habhaft werden kann!<br />
An Nexus: Ich werde nun am besten erstmal schlafen gehen, aber werde morgen mal mit der Idee etwas rumspielen und mich wieder melden! Danke erstmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996476</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 03:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 10:46:17 GMT]]></title><description><![CDATA[<p>Wenn du an unterschiedlichen Möglichkeiten interessiert bist, dann noch meine:</p>
<pre><code class="language-cpp">namespace vis {
    class Size {
    public:
        const int  y() const { return y_; }
              int&amp; y()       { return y_; }
    private:
        int y;
    };

    class Widget {
    public:
        const Size&amp; size() const { return size_; }
              Size&amp; size()       { return size_; }
    private:
        Size size_;
    };

    void test()
    {
        Widget widget;
        widget.size().y() += 10; // sowas ist doch einfach schön
        const Widget w2(widget);
        int y = w2.size().y(); // nur read-only Zugriff
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1996526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996526</guid><dc:creator><![CDATA[alternato]]></dc:creator><pubDate>Sun, 19 Dec 2010 10:46:17 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 11:20:19 GMT]]></title><description><![CDATA[<p>alternato schrieb:</p>
<blockquote>
<pre><code class="language-cpp">widget.size().y() += 10; // sowas ist doch einfach schön
</code></pre>
</blockquote>
<p>Ich habe eindeutig ein anderes Schönheitsempfinden <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>In C++ bin ich ebenfalls für set und get und zwar nach dem Codestil der Standardbibliothek: <code>get_size</code> und <code>set_size</code> . Wobei ich mir auch für reine Getter ein <code>size</code> vorstellen könnte. Als Setter sieht eine Funktion <code>size</code> aber einfach nur blöd aus.</p>
<p>Implementierungen für Properties unter C++ gibt es im Netz schon zahlreiche. Allerdings kann es schnell zu gewissen Unschönheiten und sogar Problemen kommen. C++ hat diese Möglichkeit einfach nicht und sich diese Möglichkeit irgendwie hinzubiegen, halte ich für verkehrt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996537</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 19 Dec 2010 11:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 12:11:02 GMT]]></title><description><![CDATA[<p>Hier übrigens noch ein alter Thread, der schon eine ähnliche Frage zum Thema hatte: <a href="http://www.c-plusplus.net/forum/208232" rel="nofollow">Link</a></p>
<p>Und hier der Artikel, den ich vorhin erwähnt habe, der jedoch nur eine begrenzt bessere Alternative zu Settern/Gettern bietet: <a href="http://www.kirit.com/C%2B%2B%20killed%20the%20get%20&amp;%20set%20accessors" rel="nofollow">Link</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996571</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 12:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 12:22:25 GMT]]></title><description><![CDATA[<p>alternato schrieb:</p>
<blockquote>
<p>Wenn du an unterschiedlichen Möglichkeiten interessiert bist, dann noch meine:</p>
<pre><code class="language-cpp">// [Code-Auszug]
    class Widget {
    public:
        const Size&amp; size() const { return size_; }
              Size&amp; size()       { return size_; }
    private:
        Size size_;
    };
</code></pre>
</blockquote>
<p>Und wo genau ist hier der Vorteil gegenüber öffentlichen Memberfunktionen?</p>
<ul>
<li>Bei veränderbaren Objekten gibst du eine Non-Const-Referenz auf die Variable zurück. Damit hat man den gleichen Zugriff wie auf die Variable selbst.</li>
<li>Bei konstanten Objekten gibst du eine Const-Referenz oder Kopie zurück. Dadurch kann man die Variable zwar nicht verändern, aber genau das Gleiche trifft auf eine öffentliche Membervariable zu.</li>
</ul>
<p>Der Unterschied zu <code>public</code> -Variablen sind also lediglich die Klammern beim Aufruf und der zusätzliche Code, was ich nicht unbedingt als Vorteil werten würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996574</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 12:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 12:53:03 GMT]]></title><description><![CDATA[<p>Hey, danke Nexus für's rauskramen, leider wurde der Thread irgendwie erst interessant mit dem letzten Beitrag, weil sich die Diskussion aus irgendwelchen Gründen vorher eher darum dreht, ob man denn überhaupt accessor-Methoden einsetzen sollte... Der andere Artikel war interessant zu lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996585</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 12:53:03 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:00:25 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Implementierungen für Properties unter C++ gibt es im Netz schon zahlreiche. Allerdings kann es schnell zu gewissen Unschönheiten und sogar Problemen kommen. C++ hat diese Möglichkeit einfach nicht und sich diese Möglichkeit irgendwie hinzubiegen, halte ich für verkehrt.</p>
</blockquote>
<p>Also ohne eingehende Begründung (von der ich fest ausgehe, dass du sie besitzt, nur nicht so weit ausholen wolltest) finde ich die Argumentation &quot;C++&quot; hätte etwas nicht eingabaut -&gt; versuch es nicht trotzdem, wenig überzeugend <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1996587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996587</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:00:25 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:12:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Der Unterschied zu <code>public</code> -Variablen sind also lediglich die Klammern beim Aufruf und der zusätzliche Code, was ich nicht unbedingt als Vorteil werten würde.</p>
</blockquote>
<p>Es hat einige zusätzliche Vorteile gegenüber <code>public</code> -Variablen:</p>
<ul>
<li>Du kannst die Size irgendwo speichern. In einem <code>std::vector</code> , in einer <code>union</code> , in einem <code>pImpl</code> , usw., ohne dass der Aufrufer davon wissen muss.</li>
<li>Du hast die Möglichkeit, nicht direkt eine Referenz sondern einen Acessor, der sich so verhält wie eine Size, zurückzugeben. Im Normalfall ist das allerdings nicht nötig.</li>
<li>Du kannst den Zugriff loggen.</li>
<li>Einheitlichkeit. Ein öffentlich unveränderlicher Member kann nicht als öffentliche Variable definiert werden, sondern muss wie von der STL von <code>vector::size()</code> als Funktion zur Verfügung stehen. Einmal mit, einmal ohne Klammern - immer mit sehe ich da als Vorteil.</li>
</ul>
<p>Nexus schrieb:</p>
<blockquote>
<p>Und wo genau ist hier der Vorteil gegenüber öffentlichen Memberfunktionen?</p>
</blockquote>
<ul>
<li>Einheitlichkeit. Ob ein Member unveränderlich ist wie ein <code>vector::size()</code> oder eben doch veränderlich, der Zugriff bleibt gleich.</li>
<li>Für manche Leute subjektiv schönerer Code ( <code>a.foo() += 5;</code> ).</li>
<li>Objektiv kürzerer Code.</li>
</ul>
<p>Muss dich natürlich nicht überzeugen, Boost und mein Lieblingstoolkit verwenden auch die <code>get_prop</code> / <code>set_prop</code> -Variante, das zwingt mich dann doch zu solchen Eigenschaftsfunktionen in allen damit verbundenen Klassen. Ich bin mit meinem Geschmack scheinbar in der Unterzahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996601</guid><dc:creator><![CDATA[alternato]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:12:28 GMT]]></title><description><![CDATA[<p>C++ hat ja einiges nicht eingebaut. Aber wir haben Templates, um alles nachzubauen <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="😉"
    /><br />
Ich hab teilweise schon echt interessante Ansätze gesehen, z.B. für Reflection, Multiple Dispatch, Lambda-Funktionen, benannte Argumentlisten, ...</p>
<p>Naja, wird wohl etwas OffTopic. Decimad, hast du schon etwas mit dem <code>Accessor</code> herumexperimentiert? Du hast ja gesagt, du sähest die Möglichkeit über Zeiger. Wie würde das konkret aussehen, Funktionalität zu implementieren? Auch über Callables ( <code>std::tr1::function</code> )?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996603</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:22:18 GMT]]></title><description><![CDATA[<p>Ruhig Blut junger Padawan <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 />
Also in der simpelsten Form würde ich auf die generalisierten Funktionszeiger ala tr1::function gerne erstmal verzichten, da es sich ja erstmal nicht um dynamische Beziehungen handelt, sondern um zur Compile-Zeit festgelegte (von denen man einige in die Laufzeit rüberschleppen muss, weil C++ eben diese Funktionalität nicht eingebaut hat). Man könnte sich natürlich in Form einer weiteren Generalisierung über Verkettungen Gedanken machen, um beispielsweise dynamische Restriktionen der Properties zu implementieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996612</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:33:44 GMT]]></title><description><![CDATA[<p>alternato schrieb:</p>
<blockquote>
<p>Du kannst die Size irgendwo speichern. In einem <code>std::vector</code> , in einer <code>union</code> , in einem <code>pImpl</code> , usw., ohne dass der Aufrufer davon wissen muss.</p>
</blockquote>
<p>Okay, das stimmt.</p>
<blockquote>
<p>Du hast die Möglichkeit, nicht direkt eine Referenz sondern einen Acessor, der sich so verhält wie eine Size, zurückzugeben.</p>
</blockquote>
<p>Womit wir wieder beim Property wären...</p>
<p>alternato schrieb:</p>
<blockquote>
<p>Du kannst den Zugriff loggen.</p>
</blockquote>
<p>Aber nur beschränkt. Du kannst nur aufzeichnen, wann die Referenz zurückgegeben wurde, und nicht jede einzelne Veränderung. Du siehst auch nicht, welche Art von Veränderung stattfindet. Das ist ein Nachteil gegenüber <code>SetPosition(absolutePos)</code> und <code>Move(offset)</code> , weil du <code>=</code> und <code>+=</code> nicht unterscheiden kannst.</p>
<p>Du kannst aber in der Dokumentation schreiben, dass die Referenz nicht weiterverwendet werden soll, sodass du zumindest den Zeitpunkt kennst. Auch wenn du damit ein paar sinnvolle Fälle einschränkst.</p>
<p>alternato schrieb:</p>
<blockquote>
<p>Einheitlichkeit. Ob ein Member unveränderlich ist wie ein <code>vector::size()</code> oder eben doch veränderlich, der Zugriff bleibt gleich.</p>
</blockquote>
<p>Was aber auf <code>GetSize()</code> ebenso zutrifft.</p>
<p>alternato schrieb:</p>
<blockquote>
<p>Objektiv kürzerer Code.</p>
</blockquote>
<p>Das kommt erst bei komplexeren Ausdrücken zum Tragen, wie bei</p>
<pre><code class="language-cpp">obj.SetSize(5 * obj.GetSize());
// vs
obj.Size() *= 5;
</code></pre>
<p>Dafür nimmst du eine geringere Kontrollmöglichkeit in Kauf (siehe oben). Falls dieser spezifische Fall oft vorkommt, könnte man sich auch sowas überlegen:</p>
<pre><code class="language-cpp">obj.Scale(5);
</code></pre>
<p>alternato schrieb:</p>
<blockquote>
<p>Muss dich natürlich nicht überzeugen [...]. Ich bin mit meinem Geschmack scheinbar in der Unterzahl.</p>
</blockquote>
<p>Ich bin nur bisher meist mit konventionellen Get/Set-Methoden zufrieden gewesen. Ab und zu habe ich auch Strukturen mit nur öffentlichen Variablen.</p>
<p>Aber wenn, dann denke ich am ehesten sowas wie den <code>Accessor</code> aus diesem Thread. Diese Alternative könnte durchaus in manchen Fällen Potenzial haben. Und zufälligerweise stehe ich auch gleich vor einem ähnlichen Problem (einer Klasse mit sehr vielen Get/Set-Funktionen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996619</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:40:49 GMT]]></title><description><![CDATA[<p>Nach diesem Motto hatte ich mir das vorgestellt: (Man beachte die nicht so tolle Konstruktion, this vor dem Betreten des Konstruktors zu verwenden...)</p>
<pre><code class="language-cpp">template&lt; typename DataType, typename Class, void (Class::*Setter)( const DataType&amp; ), DataType (Class::*Getter)() const &gt;
class Accessor
{
public:
	Accessor( Class* p ) : this_(p) {}

	Accessor&amp; operator=( const DataType&amp; data )
	{
		(this_-&gt;*Setter)( data );
		return *this;
	}

private:
	Class* this_;
};

class Test {
public:
	Test() : Value( this ) {}

private:
	void setValue( const int&amp; val ) { std::cout &lt;&lt; &quot;Setting to &quot; &lt;&lt; val; }
	int getValue() const;

public:
	Accessor&lt; int, Test, &amp;Test::setValue, &amp;Test::getValue &gt; Value;
};

int main()
{
	Test myTest;

	myTest.Value = 10;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1996620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996620</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:49:37 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Implementierungen für Properties unter C++ gibt es im Netz schon zahlreiche. Allerdings kann es schnell zu gewissen Unschönheiten und sogar Problemen kommen. C++ hat diese Möglichkeit einfach nicht und sich diese Möglichkeit irgendwie hinzubiegen, halte ich für verkehrt.</p>
</blockquote>
<p>Also ohne eingehende Begründung (von der ich fest ausgehe, dass du sie besitzt, nur nicht so weit ausholen wolltest) finde ich die Argumentation &quot;C++&quot; hätte etwas nicht eingabaut -&gt; versuch es nicht trotzdem, wenig überzeugend <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>
</blockquote>
<p>Gut, dann bringe ich mal ein einfaches Argument:<br />
Man verwendet Getter und Setter unterandem, damit zusätzlicher Code bei der jeweiligen Aktion durchgeführt werden kann. Auch wenn es nur ein Breakpoint ist oder man die Aktion protokollieren möchte. Wie erreichst du dies mit den nachgebauten Properties? Geht nicht! Es erfordert gleich die Abänderung der Property-Hilfsklasse und betrifft somit alle Properties, statt nur eines einzelnen. Oder dann muss man einen Callback-Mechanismus einbauen, welcher aber recht aufwendig sein kann. <code>std::tr1::function</code> oder <code>boost::function</code> sind unheimlich komplexe Gebilde und kosten auch einiges an Zeit. Wenn man anfängt für so Dinge wie Setter und Getter viel Zeit zu verbraten, nur weil man dadurch 3 Zeichen einsparen kann, dann ist das irgendwie recht fraglich.<br />
Wenn du die Properties in C# ansiehst, dann kannst du dort ganz einfach die Getter und Setter eines jeden Properties an deine Bedürfnisse anpassen, ohne zusätzliche Laufzeit zu verbraten.</p>
<p>Es ist alles eben ein wenig eine Frage des Preis-Leistungsverhältnis. Was bringen einem Properties in C++? Das einzige Argument ist, welches ich bisher gesehen habe, dass man nicht mehr <code>size()</code> schreiben muss sondern <code>size</code> . Es geht also darum zwei Klammern einzusparen. Damit soll angeblich die Lesbarkeit erhöht werden. Dass man auch mit temporären Zwischenvariablen arbeiten kann, wird hingegen oft ignoriert:</p>
<pre><code class="language-cpp">int x = pos.get_x();
int y = pos.get_y();
int width = rect.get_width();

int index = y * width + x;
</code></pre>
<p>Was soll daran unübersichtlich sein?</p>
<p>Ein anderes bisschen einfacheres Argument:<br />
Wie machst du Properties kopierbar, aber von aussen nicht zuweisbar?</p>
<p>Properties Workarounds in C++ bieten keinerlei relevanten Vorteil. Dafür können sie Nachteile mit sich bringen. Wieso sollte man also eine Technik einsetzen, welche unter dem Strich nichts bringt?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996626</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:54:40 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Also in der simpelsten Form würde ich auf die generalisierten Funktionszeiger ala tr1::function gerne erstmal verzichten, da es sich ja erstmal nicht um dynamische Beziehungen handelt, sondern um zur Compile-Zeit festgelegte</p>
</blockquote>
<p>Genau, deshalb auch noch der Vorschlag &quot;Da Accessor ein Template ist, könntest du unter Umständen sogar (Member-)Funktionszeiger als Template-Parameter fest verdrahten.&quot; Scheinbar hast du das auch gerade getan <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>Mit Metaprogrammierung könnte man wahrscheinlich noch etwas optimieren, sodass z.B. <code>int</code> statt <code>const int&amp;</code> verwendet werden kann.</p>
<p>Decimad schrieb:</p>
<blockquote>
<p>Man beachte die nicht so tolle Konstruktion, this vor dem Betreten des Konstruktors zu verwenden...</p>
</blockquote>
<p>Ist das ein Problem? Du verwendest ja nur den Zeiger als Verweis. Soweit ich weiss, wird es erst beim tatsächlichen Zugriff auf <code>this</code> problematisch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996628</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:54:40 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 13:56:30 GMT]]></title><description><![CDATA[<p>Ja, Nexus, ich habe mir schon ein ParameterType-Template geschrieben, dass entsprechend Referenzen oder Per-Value macht, je nachdem wie groß die Typen sind, das könnte man hier natürlich einsetzen, aber hätte nicht der übersichtlichen Darstellung der Idee gedient^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996629</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 13:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 14:02:18 GMT]]></title><description><![CDATA[<p>Dravere, ich kann das alles nachvollziehen, was du schreibst. Allerdings ist meinem Beispiel nicht der Vorteil tragend, dass man sich das () spart, sondern dass man die intuitive Zuweisungs-Operation benutzen kann (zumindest in meinen Augen). Zudem hat man intern immernoch den setter und den getter, sodass man dort alles machen kann, was man auch normalerweise tun kann. Mit den Kosten hast du natürlich recht, mir ist auch ein Dorn im Auge, dass ich den this-Zeiger mitspeichern muss, aber die Kosten sind nicht so hoch wie tr1::function und ähnlich dynamisches (das wollte ich ja gezielt vermeiden, wie ich auch schon schrieb).<br />
Ich hasse solche Konflikte, ganz ehrlich <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1996632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996632</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 19 Dec 2010 14:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 14:16:58 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Allerdings ist meinem Beispiel nicht der Vorteil tragend, dass man sich das () spart, sondern dass man die intuitive Zuweisungs-Operation benutzen kann (zumindest in meinen Augen).</p>
</blockquote>
<p>Es geht also darum?</p>
<pre><code class="language-cpp">text.x = 20;
text.set_x(20);
</code></pre>
<p>Du willst wirklich diesen riesigen Aufwand betreiben wegen sowas? Dir alle Nachteile (gibt noch mehr als bisher genannt) einkaufen, weil du es ein bisschen intuitiver findest? Setter und Getter sind äusserst üblich in Programmiersprachen. Daran gewöhnst du dich sehr schnell.</p>
<p>Decimad schrieb:</p>
<blockquote>
<p>Ich hasse solche Konflikte, ganz ehrlich <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>
</blockquote>
<p>Ich sehe keinen Konflikt. Die Kosten sind im Verhältnis zum Nutzen so überdimensional, dass die einzig logische Entscheidung gegen Property Workarounds in C++ sein muss.<br />
Mag zwar eine interessante akademische Überlegung sein und vielleicht Spass machen, sowas mal auszuprobieren - was ich auch schon gemacht habe, aber für den praktischen Einsatz ist es einfach untauglich.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996640</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 19 Dec 2010 14:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Benennung von &amp;quot;Accessors&amp;quot; on Sun, 19 Dec 2010 14:20:05 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Es erfordert gleich die Abänderung der Property-Hilfsklasse und betrifft somit alle Properties, statt nur eines einzelnen. Oder dann muss man einen Callback-Mechanismus einbauen, welcher aber recht aufwendig sein kann. <code>std::tr1::function</code> oder <code>boost::function</code> sind unheimlich komplexe Gebilde und kosten auch einiges an Zeit.</p>
</blockquote>
<p>Darum auch die Hardwire-Lösung über Templateparameter. <code>Accessor</code> muss dazu nicht verändert werden, da es generisch ist.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Dass man auch mit temporären Zwischenvariablen arbeiten kann, wird hingegen oft ignoriert:</p>
<pre><code class="language-cpp">// [leicht abgeändert]
int x = pos.get_x();
int y = pos.get_y();
int width = rect.get_width();

pos.set_x(y * width + x); // [Setter eingebaut]
</code></pre>
</blockquote>
<p>Und dass das viel mehr Code als</p>
<pre><code class="language-cpp">pos.x = pos.y * pos.width + pos.x; // oder auch
pos.x() = pos.y() * pos.width() + pos.x();
</code></pre>
<p>braucht, wird scheinbar von dir ignoriert.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Was soll daran unübersichtlich sein?</p>
</blockquote>
<p>Es ist nicht unübersichtlich, aber es braucht verdammt viel Code, um fast nichts zu erreichen. Bei grösseren Objekten kommt die Kopie dazu. Es sei denn, du speicherst etwas als Const-Referenz (falls auch eine solche zurückgegeben wird), womit aber auch viele Leute ein Problem haben.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ein anderes bisschen einfacheres Argument:<br />
Wie machst du Properties kopierbar, aber von aussen nicht zuweisbar?</p>
</blockquote>
<p>Das ist ein guter Punkt, hier müsste man sich was überlegen. Eine Einschränkung wäre vielleicht, dass man trotzdem den <code>operator()</code> aufruft, um auch keine Konflikte mit impliziten Konvertierungen etc. zu bekommen.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Properties Workarounds in C++ bieten keinerlei relevanten Vorteil. Dafür können sie Nachteile mit sich bringen. Wieso sollte man also eine Technik einsetzen, welche unter dem Strich nichts bringt?</p>
</blockquote>
<p>Die Prämisse stimmt schon nicht. Mit Properties kann man eine einfachere und intuitivere Syntax haben.</p>
<p>Natürlich sind sie nicht ganz so toll wie in C#, und es gibt einige Einschränkungen. Für den Alltagsgebrauch würde ich auch klassische Setter/Getter empfehlen. Aber nur weil man ein Sprachkonzept an eine andere Sprache anlehnt, schrillen bei dir die Alarmglocken und du musst jeden Versuch schon kategorisch schlecht finden.</p>
<p>Die Idee von Properties ist interessant. Ich sage nicht, man soll sie jetzt immer einsetzen. Aber man kann ja mal ein wenig herumexperimentieren, was sie alles so können, ohne gleich in die böse Sprachkonzept-Übernehmer-Schublade gesteckt zu werden. Gut möglich, dass sie sich nicht bewähren, aber dann wars ein lustiges Experiment.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996641</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Dec 2010 14:20:05 GMT</pubDate></item></channel></rss>