<?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[Auf Änderungen an Variablen reagieren]]></title><description><![CDATA[<p>Hi<br />
Vorweg möchte ich erwähnen dass ich von VB vor kurzem erst zu C++ gewechselt habe (ok ok. das wechseln wird noch n bisschen dauern <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 habe eine Klasse mit diversen Attributen. Nun möchte ich verhindern, dass der Programmierer der mit diesen Klassen arbeitet direkt die Werte manipulieren kann. Es gibt bestimmte Wertbereiche welche wiederum in Abhängigkeit von anderen Attributen stehen. Kurz gesagt möchte ich direkt nachdem eine Membervariable geändert wurde, diese auf Plausibilität prüfen und gegebenfalls korrigieren. Unter VB konnte ich dies einfach realisieren indem ich die Variablenzuweisungen auf Funktionen verküpfte. So wurde jedes mal wenn eine Variable geändert wurde meine Funktion aufgerufen die ihre Checks durchführen konnte.<br />
Unter C++ will mir hierfür irgendwie nichts einfallen was mir gefallen würde.</p>
<p>1. Möglichkeit:<br />
Ich kapsle die eigentlichen Attribute privat und greife über Funktionen wie</p>
<pre><code class="language-cpp">myClass.SetMyVar(foo);
foo = myClass.GetMyVar();
</code></pre>
<p>zu. Daran gefällt mir die Tatsache nicht dass ich 2 verschiedene Funktionen zum Lesen und schreiben brauche. Das ganze wirklich unnötig kompliziert.</p>
<p>2. Möglichkeit<br />
Ich führe Public und Privat Membervariablen ein. Der Anwender schreibt seine Wunschwerte in die Publicwerte, und wenn das nächste mal eine Methode genau diesen Wert braucht, ließt er die Publicvariante aus, und wenn diese gültig ist, schreibt er es in die private rein. Was mir hierbei nicht gefällt ist die Fehleranfääligkeit, da ich die Checks völlig dezentral über den gesammten Quellcode durchführen muss. Ausserdem riskant ist, wenn andere Teile auf die Varible zugreifen bevor diese gecheckt wurde, und annehmen sie sei gültig.</p>
<p>3. Möglichkeit<br />
Ich führe für die Variablen eigene Objekte ein. Sprich, ich erstelle aus integrierten Datentypen wie int eine Klasse, bei der ich die Zuweisungsoperatoren überlade.<br />
Meiner Meinung nach ein ziemlicher Overflow.</p>
<p>Wie macht man es richtig? Ist eine von meinen Ideen, vielleicht die richtige Lösung?</p>
<p>sweety</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152084/auf-änderungen-an-variablen-reagieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 21:48:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152084.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Jul 2006 18:58:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 18:58:29 GMT]]></title><description><![CDATA[<p>Hi<br />
Vorweg möchte ich erwähnen dass ich von VB vor kurzem erst zu C++ gewechselt habe (ok ok. das wechseln wird noch n bisschen dauern <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 habe eine Klasse mit diversen Attributen. Nun möchte ich verhindern, dass der Programmierer der mit diesen Klassen arbeitet direkt die Werte manipulieren kann. Es gibt bestimmte Wertbereiche welche wiederum in Abhängigkeit von anderen Attributen stehen. Kurz gesagt möchte ich direkt nachdem eine Membervariable geändert wurde, diese auf Plausibilität prüfen und gegebenfalls korrigieren. Unter VB konnte ich dies einfach realisieren indem ich die Variablenzuweisungen auf Funktionen verküpfte. So wurde jedes mal wenn eine Variable geändert wurde meine Funktion aufgerufen die ihre Checks durchführen konnte.<br />
Unter C++ will mir hierfür irgendwie nichts einfallen was mir gefallen würde.</p>
<p>1. Möglichkeit:<br />
Ich kapsle die eigentlichen Attribute privat und greife über Funktionen wie</p>
<pre><code class="language-cpp">myClass.SetMyVar(foo);
foo = myClass.GetMyVar();
</code></pre>
<p>zu. Daran gefällt mir die Tatsache nicht dass ich 2 verschiedene Funktionen zum Lesen und schreiben brauche. Das ganze wirklich unnötig kompliziert.</p>
<p>2. Möglichkeit<br />
Ich führe Public und Privat Membervariablen ein. Der Anwender schreibt seine Wunschwerte in die Publicwerte, und wenn das nächste mal eine Methode genau diesen Wert braucht, ließt er die Publicvariante aus, und wenn diese gültig ist, schreibt er es in die private rein. Was mir hierbei nicht gefällt ist die Fehleranfääligkeit, da ich die Checks völlig dezentral über den gesammten Quellcode durchführen muss. Ausserdem riskant ist, wenn andere Teile auf die Varible zugreifen bevor diese gecheckt wurde, und annehmen sie sei gültig.</p>
<p>3. Möglichkeit<br />
Ich führe für die Variablen eigene Objekte ein. Sprich, ich erstelle aus integrierten Datentypen wie int eine Klasse, bei der ich die Zuweisungsoperatoren überlade.<br />
Meiner Meinung nach ein ziemlicher Overflow.</p>
<p>Wie macht man es richtig? Ist eine von meinen Ideen, vielleicht die richtige Lösung?</p>
<p>sweety</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090337</guid><dc:creator><![CDATA[sweety]]></dc:creator><pubDate>Sun, 02 Jul 2006 18:58:29 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 19:01:47 GMT]]></title><description><![CDATA[<p>Möglichkeit 1 ist eigentlich die gewöhnliche und einfachste. Was spricht denn noch dagegen?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090341</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sun, 02 Jul 2006 19:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 19:07:23 GMT]]></title><description><![CDATA[<p>wie gesagt. Ich finde es ein wenig unübersichtlich und schlecht leserlich. Bin es halt von VB gewohnt im &quot;Backend&quot; wie ich es jetzt mal nenne, alles zu perfektionieren, damit das &quot;Frontend&quot; so einfach wie möglich mit der Klasse arbeiten kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090346</guid><dc:creator><![CDATA[sweety]]></dc:creator><pubDate>Sun, 02 Jul 2006 19:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 19:21:46 GMT]]></title><description><![CDATA[<p>mach doch</p>
<pre><code class="language-cpp">class Foo {
 private:
  int bar;
 public:
  int&amp; getBar() { return bar; };
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1090352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090352</guid><dc:creator><![CDATA[KingOfTheBlueMouse]]></dc:creator><pubDate>Sun, 02 Jul 2006 19:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 19:21:56 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Public Methoden können eine Referenz oder einen Zeiger<br />
auf private Daten zurückliefern, was Lesen oder<br />
Schreiben dieser Daten ermöglicht. Diese<br />
Methoden können auch Code zum Überprüfen der Daten<br />
enthalten oder Aktionen mit den Daten veranlassen.</p>
<p>mfg<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1090353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090353</guid><dc:creator><![CDATA[haase]]></dc:creator><pubDate>Sun, 02 Jul 2006 19:21:56 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 19:54:13 GMT]]></title><description><![CDATA[<p>KingOfTheBlueMouse schrieb:</p>
<blockquote>
<p>mach doch</p>
<pre><code class="language-cpp">class Foo {
 private:
  int bar;
 public:
  int&amp; getBar() { return bar; };
};
</code></pre>
</blockquote>
<p>damit kann man 'bar' aber verändern. das will er doch nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090371</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Sun, 02 Jul 2006 19:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 20:35:40 GMT]]></title><description><![CDATA[<p>Alternativ kannst du Properties verwenden.<br />
Hier eine mal so hingeschriebene Variante:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
struct PropertyCallbackBase
{
    virtual ~PropertyCallbackBase(){}
    virtual T &amp; Emit(T &amp; var) = 0;
};

template&lt;typename T, typename C&gt;
struct PropertyCallback : PropertyCallbackBase&lt;T&gt;
{
    typedef T &amp; (C::*CallbackType)(T &amp;);

    PropertyCallback(C * c, CallbackType meth)
        :PropertyCallbackBase&lt;T&gt;()
        ,m_obj(c)
        ,m_callback(meth)
    {}

    PropertyCallback()
        :PropertyCallbackBase&lt;T&gt;()
        ,m_obj(0)
        ,m_callback(0)
    {}

    virtual ~PropertyCallback()
    {}

    virtual T &amp; Emit(T &amp; var)
    {
        if(m_obj &amp;&amp; m_callback)
            return ((*m_obj).*m_callback)(var);
        return var;
    }
private:
    C * m_obj;
    CallbackType m_callback;
};

template&lt;typename T&gt;
struct Property
{
    Property()
        : on_set_value(0)
    {}

    virtual ~Property()
    { 
        delete on_set_value; 
    }

    operator T const &amp;(){ return m_value; }

    template&lt;typename C&gt;
    void RegisterOnSetValue(C * c, T &amp; (C::*meth)(T &amp;))
    {
        on_set_value = new PropertyCallback&lt;T,C&gt;(c,meth);
    }

    void operator=( T const &amp; val)
    {
        if(on_set_value)
        {
            T tmp = val;
            m_value = on_set_value-&gt;Emit(tmp);
        }
        else 
        {
            m_value = val;        
        }
    }

private:

    PropertyCallbackBase&lt;T&gt; * on_set_value;             

    T m_value;
};

struct Test
{
    Test(){ value.RegisterOnSetValue(this,&amp;Test::OnSet); }
    int &amp; OnSet(int &amp; val){ std::cout &lt;&lt; &quot;Setted &quot; &lt;&lt; val &lt;&lt; std::endl; return val; }       
    Property&lt;int&gt; value;       
};

int main()
{
    Test t;
    t.value = 10;
    int tmp = t.value;
}
</code></pre>
<p>Aber wenn du das verwendest solltest du auch wissen wie man damit umgeht und was da passiert. <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>BR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090396</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sun, 02 Jul 2006 20:35:40 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 21:06:44 GMT]]></title><description><![CDATA[<p>net schrieb:</p>
<blockquote>
<p>damit kann man 'bar' aber verändern. das will er doch nicht</p>
</blockquote>
<pre><code class="language-cpp">class Foo {
 private:
  int bar;
 public:
  const int&amp; getBar() const { return bar; };
};
</code></pre>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090408</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sun, 02 Jul 2006 21:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 22:05:10 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>net schrieb:</p>
<blockquote>
<p>damit kann man 'bar' aber verändern. das will er doch nicht</p>
</blockquote>
<pre><code class="language-cpp">class Foo {
 private:
  int bar;
 public:
  const int&amp; getBar() const { return bar; };
};
</code></pre>
</blockquote>
<p>das lässt sich auch verändern...</p>
<pre><code>Foo f;
   const_cast&lt;int&amp;&gt;(f.getBar()) = 123;
</code></pre>
<p>warum nicht einfach so?</p>
<pre><code>class Foo 
{
 private:
  int bar;
 public:
  int getBar() 
  { 
      return bar; 
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1090419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090419</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Sun, 02 Jul 2006 22:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Änderungen an Variablen reagieren on Sun, 02 Jul 2006 22:13:13 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>klar läßt sich jeder Schutz in C/C++ irgendwie aushebeln.<br />
Fakt ist aber das ordentlicher Const-Correctness einem Programmierer, der sich seinen eigenen Quellcode nicht gewollt selber zerschießt, sehr hilft.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1090422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1090422</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sun, 02 Jul 2006 22:13:13 GMT</pubDate></item></channel></rss>