<?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[methodenkapselung]]></title><description><![CDATA[<p>ich suche nach einer möglichkeit das der user meiner klasse unabhängig von seiner nutzung ein objekt verwenden kann ohne das ich alle member mittels getter offen lege.<br />
einfach bespiel wäre eine methode eines rechteckts zum zeichnen.<br />
mögliche implementierungen zum wären zb: winapi, directx, qt, asci usw usw.<br />
folgende ideen hatte ich schon:</p>
<pre><code class="language-cpp">template&lt;
	class T_&gt;
class foo
{
	public:
		typedef T_		value_type;

		foo(const T_&amp; t = 0) : mt(t) { }

		void set_callback(boost::function&lt;void (const T_&amp; t)&gt; func)
			{ m_Callback = func; }

		void execute() const
		{
			if(m_Callback)
				m_Callback(mt);
		}

	private:
		T_ 										mt;
		boost::function&lt;void (const T_&amp; t)&gt;		m_Callback;
};

template&lt;
	class T_&gt;
void bar(const T_&amp; t) { std::cout &lt;&lt; t &lt;&lt; std::endl; }

// usage:
// f.set_callback(bar&lt;foo_type::value_type&gt;);
// f.execute();
</code></pre>
<p>grosser nachteil daran ist die objektgrösse ansteigt und falls das rechteck<br />
in eine datei gespeichert wird erhöht dieses natürlich merklich die dateigrösse<br />
und der callbackmember ist beim auslesen natürlich nutzlos.</p>
<p>zweite möglichkeit wäre eine methode zu deklarieren aber die definition<br />
dem user der klasse zu überlassen. ich denke das dieses eher unüblich ist,<br />
zumindest keine ich kein beispiel. finde dieses aber eine elegante lösung</p>
<pre><code class="language-cpp">template&lt;
	class T_&gt;
class foo
{
	public:
		void execute() const;

	private:
		T_ 	mt;
};
// usercode
template&lt;class T_&gt; void foo&lt;T_&gt;::execute() const { std::cout &lt;&lt; mt &lt;&lt; std::endl; }
</code></pre>
<p>dritte möglichkeit natürlich wären policys</p>
<pre><code class="language-cpp">template&lt;
	class T_&gt;
class bar
{
	public:
		bar(const T_&amp; t) : mt(t) { }

		void execute() const { std::cout &lt;&lt; mt &lt;&lt; std::endl; }

	protected:
		T_ 	mt;
};

template&lt;
	class T_,
	template &lt;class&gt; class ExecutePolicy_&gt;
class foo : public ExecutePolicy_&lt;T_&gt;
{
	public:
		typedef T_		value_type;

		foo(const T_&amp; t = 0) : ExecutePolicy_&lt;T_&gt;(t) { }
};
</code></pre>
<p>welche vorschläge habt ihr noch? ideen? anregungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169304/methodenkapselung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 16:29:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169304.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Jan 2007 08:03:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 08:03:27 GMT]]></title><description><![CDATA[<p>ich suche nach einer möglichkeit das der user meiner klasse unabhängig von seiner nutzung ein objekt verwenden kann ohne das ich alle member mittels getter offen lege.<br />
einfach bespiel wäre eine methode eines rechteckts zum zeichnen.<br />
mögliche implementierungen zum wären zb: winapi, directx, qt, asci usw usw.<br />
folgende ideen hatte ich schon:</p>
<pre><code class="language-cpp">template&lt;
	class T_&gt;
class foo
{
	public:
		typedef T_		value_type;

		foo(const T_&amp; t = 0) : mt(t) { }

		void set_callback(boost::function&lt;void (const T_&amp; t)&gt; func)
			{ m_Callback = func; }

		void execute() const
		{
			if(m_Callback)
				m_Callback(mt);
		}

	private:
		T_ 										mt;
		boost::function&lt;void (const T_&amp; t)&gt;		m_Callback;
};

template&lt;
	class T_&gt;
void bar(const T_&amp; t) { std::cout &lt;&lt; t &lt;&lt; std::endl; }

// usage:
// f.set_callback(bar&lt;foo_type::value_type&gt;);
// f.execute();
</code></pre>
<p>grosser nachteil daran ist die objektgrösse ansteigt und falls das rechteck<br />
in eine datei gespeichert wird erhöht dieses natürlich merklich die dateigrösse<br />
und der callbackmember ist beim auslesen natürlich nutzlos.</p>
<p>zweite möglichkeit wäre eine methode zu deklarieren aber die definition<br />
dem user der klasse zu überlassen. ich denke das dieses eher unüblich ist,<br />
zumindest keine ich kein beispiel. finde dieses aber eine elegante lösung</p>
<pre><code class="language-cpp">template&lt;
	class T_&gt;
class foo
{
	public:
		void execute() const;

	private:
		T_ 	mt;
};
// usercode
template&lt;class T_&gt; void foo&lt;T_&gt;::execute() const { std::cout &lt;&lt; mt &lt;&lt; std::endl; }
</code></pre>
<p>dritte möglichkeit natürlich wären policys</p>
<pre><code class="language-cpp">template&lt;
	class T_&gt;
class bar
{
	public:
		bar(const T_&amp; t) : mt(t) { }

		void execute() const { std::cout &lt;&lt; mt &lt;&lt; std::endl; }

	protected:
		T_ 	mt;
};

template&lt;
	class T_,
	template &lt;class&gt; class ExecutePolicy_&gt;
class foo : public ExecutePolicy_&lt;T_&gt;
{
	public:
		typedef T_		value_type;

		foo(const T_&amp; t = 0) : ExecutePolicy_&lt;T_&gt;(t) { }
};
</code></pre>
<p>welche vorschläge habt ihr noch? ideen? anregungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202411</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 04 Jan 2007 08:03:27 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 08:14:10 GMT]]></title><description><![CDATA[<p>Ich wäre für virtuelle Methoden. Die Basisklasse deklariert die notwendigsten Daten und der Anwender leitet eine eigene Klasse davon ab, die sich um's Zeichnen kümmert:</p>
<pre><code class="language-cpp">class rectangle
{
public:
  virtual void show_rect() = 0;
  virtual void set_size(int width,int height) = 0;
  ...
};

//Anwender
class DX_rectangle : public rectangle
{
public:
  virtual void show_rect()
  {/* zeichne Rechteck über DirectX*/}
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1202414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202414</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 04 Jan 2007 08:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 09:40:14 GMT]]></title><description><![CDATA[<p>miller_m schrieb:</p>
<blockquote>
<p>...der user meiner klasse unabhängig von seiner nutzung ein objekt verwenden kann...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Sorry, das verstehe ich nicht.</p>
<p>Vllt. deswegen verstehe ich auch die ganze Frage nicht....ich dachte immer, eine Klasse definiert, genau das (&quot;Was kann ein User mit einem Objekt dieser Klasse machen ?&quot;) über die Funktionen und Attribute, die sie bereitstellt ...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202468</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 04 Jan 2007 09:40:14 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 09:49:49 GMT]]></title><description><![CDATA[<p>Im Prinzip mußt du eine Schnittstelle definieren. Eine Möglichkeit wäre, das sie abstrakt ist und du verschiedene Implementierungen anbietest bzw. jemand anbieten kann. (siehe CStollst Antwort)</p>
<p>Eine andere ist die Verwendung von Adaptern. D.h. eine Klasse definiert ebenfalls eine Schnittstelle, und enthält ein Member mit einer konkreten Klasse. Du kannst dann über den Adapter einfach die Aufrufe weiterleiten, an die Member-Klasse, die der Benutzer so nicht direkt benutzt.</p>
<p>Und dann noch eine Möglichkeit: Context-Pattern. Finde ich immer noch am besten. <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="😃"
    /> Leider habe ich da im Netz keine gute Beschreibung gefunden. Das Context-Pattern wird aber in diversen Frameworks eingesetzt, z.B. im ACE. damit kannst du sogar deine Klasse komplett verstecken, also brauchst sie nicht mal in ein Header bekannt geben, weil der Benutzer nur die Context-Klasse zu Gesicht bekommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202483</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 04 Jan 2007 09:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 10:39:38 GMT]]></title><description><![CDATA[<p>es handelt sich grösstenteils um templates somit müsste ich dann wieder irgendwelche &quot;template/virtual hacks&quot; machen (ist gerade kein anderer name eingefallen <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="😃"
    /> ) sprich weitere basisklassen und virtuals. ich dachte vielmehr an eine compiletimelösung.<br />
die methode ist auch mehr optional anzusehen <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="😉"
    /> einfacher ausgedrückt: das rechteck ist zum rechnen da, nicht zum zeichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202545</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 04 Jan 2007 10:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:02:24 GMT]]></title><description><![CDATA[<p>Warum nicht sowas:</p>
<pre><code class="language-cpp">class Rectangle {
private:
    int x,y,...;
public:
    template&lt;class Drawer&gt;
    void draw() {
        Drawer().draw(*this);
    }
};

struct ConsoleTextDrawer {
    void draw(const Rechteck&amp; re) {
        std::cout &lt;&lt; &quot;x = &quot; &lt;&lt; re.getX() ...
    } 
};

//usage:
Rectangle myrect;
myrect.draw&lt;ConsoleTextDrawer&gt;();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1202629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202629</guid><dc:creator><![CDATA[Kurz und gut:]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:09:01 GMT]]></title><description><![CDATA[<p>Kurz und gut: schrieb:</p>
<blockquote>
<p>Warum nicht sowas:</p>
<pre><code class="language-cpp">class Rectangle {
private:
    int x,y,...;
public:
    template&lt;class Drawer&gt;
    void draw() {
        Drawer().draw(*this);
    }
};

struct ConsoleTextDrawer {
    void draw(const Rechteck&amp; re) {
        std::cout &lt;&lt; &quot;x = &quot; &lt;&lt; re.getX() ...
    } 
};

//usage:
Rectangle myrect;
myrect.draw&lt;ConsoleTextDrawer&gt;();
</code></pre>
</blockquote>
<p>ein haufen getter die die kapselung aufbrechen. gut im falle eines rechtecks wären es maximal vier, das ist aber imo nicht der sinn einer klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202637</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:09:01 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:11:50 GMT]]></title><description><![CDATA[<p>Du erstellst ein Rechteck und willst nacher nicht mehr wissen wie gross es ist / wie seine Koordianten etc. sind?<br />
Zu was brauchst du denn diese ganzen Objekte? Ist es nur ein Beispiel mit dem Recheckt oder hast du wirklich geometrische Figuren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202639</guid><dc:creator><![CDATA[Kurz und gut:]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:22:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Rectangle
{
	// ...
	template&lt;class Functor&gt;
	void foo(Functor &amp;func)
	{
		func(member1, member2, ...);
	}
};

// user
struct myFunc
{
	// haufen eigener funktionen
	myFunc()
	{
		// eigene init aufrufen
	}
	~myFunc()
	{
		// eigene finisher aufrufen
	}
	void operator()(const Typ &amp;t1, const Typ &amp;t2, ...){ ... }
};

myFunc m;
r.foo(m); // Rectangle
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1202646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202646</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:22:30 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:21:07 GMT]]></title><description><![CDATA[<p>Kurz und gut: schrieb:</p>
<blockquote>
<p>Du erstellst ein Rechteck und willst nacher nicht mehr wissen wie gross es ist / wie seine Koordianten etc. sind?<br />
Zu was brauchst du denn diese ganzen Objekte? Ist es nur ein Beispiel mit dem Recheckt oder hast du wirklich geometrische Figuren?</p>
</blockquote>
<p>rechteck war natürlich nur ein beispiel <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 sollte ich die koordinaten wissen wollen?<br />
quick&amp;dirty bsp:</p>
<pre><code class="language-cpp">class rect
{
    public:
        rect(int x_, int y_, int w_, int h_)
        : x(x_), y(y_), w(w_), h(h_) { }

        int seitenlänge() const { // ...
        int umfang() const { // ...
        int fläche() const { // ...

        rect&amp; operator += (const rect&amp; src) { // ...

        bool intersects( // ...

    private:
        int x, y, w, h;
};
</code></pre>
<p>ich sehe jetzt keinen grund warum ich getX() implementieren sollte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202649</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:22:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9660">@thordk</a><br />
keine schlechte idee</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202652</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:29:54 GMT]]></title><description><![CDATA[<p>Wenn niemand außen die internen Daten deines Objekts erfahren muß, muß das Objekt auch selber wissen, wie es dargestellt werden will. Also müsstest du den Zeichencode auch in der Rechteck-Klasse unterbringen (eventuell auf Basis einiger abstrakt vorgegebenen Grundoperationen):</p>
<pre><code class="language-cpp">class drawer
{
public:
  virtual void draw_line(int x1,int y1,int x2,int y2) = 0;
  ...
};

class DX_drawer : public drawer
{
public:
  virtual void draw_line(...) {/*zeichne Linie mit DX*/}
  ...
};

//...

class gobject
{
public:
  virtual void draw(drawer&amp; target)=0;
}

class rectangle : public gobject
{
  int y,x,w,h;
public:
  ...
  virtual void draw(drawer&amp; target)
  {
    target.draw_line(x,y,x+w,y);
    target.draw_line(x+w,y,x+w,y+h);
    target.draw_line(x+w,y+h,x,y+h);
    target.draw_line(x,y+h,x,y);
  }
};

...
DX_drawer the_drawer;

rectangle r;
r.draw(the_drawer);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1202662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202662</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to methodenkapselung on Thu, 04 Jan 2007 12:48:29 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn niemand außen die internen Daten deines Objekts erfahren muß, muß das Objekt auch selber wissen, wie es dargestellt werden will.</p>
</blockquote>
<p>jein, was wäre wenn der user linksrum statt rechtsrum zeichnen möchte oder sein rechteck aus zwei dreiecken erstellen will usw usw<br />
ich hoffe ich fange jetzt nicht an zu nerven <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="😃"
    /> ich suche ja nur nach ideen und lösungsansätzen. vermutlich werde ich aber in die policy geschichte gehen.<br />
dank euch allen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202680</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:48:29 GMT</pubDate></item></channel></rss>