<?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[Variablen mit Callback]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin auf der Suche nach einer Methode, diese get/set Funktionen in Klassen zu vermeiden, weil die doch ziemlich laestig sind. Andererseits moechte ich schon, dass Variablen nicht ohne Wissen der Klasse einfach geaendert werden koennen.</p>
<p>Mein Ansatz war nun folgender:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U&gt;
class CBMember;

template &lt;typename T, typename U&gt;
std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const CBMember&lt;T, U&gt;&amp; cb);

template &lt;typename T, typename U&gt;
class CBMember
{
public:
    CBMember ();

    void init (U* parent, T (U::*cbFunc)(const T&amp; value));

    T&amp; operator= (const T&amp; value);
    T operator() () const;

    friend std::ostream&amp; operator&lt;&lt; &lt;&gt; (std::ostream&amp; os, const CBMember&lt;T, U&gt;&amp; cb);

private:
    U* _parent;
    T (U::*_cbFunc)(const T&amp; value);

    T member;
};

template &lt;typename T, typename U&gt;
CBMember&lt;T, U&gt;::CBMember () : _parent(0), _cbFunc(0)
{
}

template &lt;typename T, typename U&gt;
void CBMember&lt;T, U&gt;::init (U* parent, T (U::*cbFunc)(const T&amp; value))
{
    _parent = parent;
    _cbFunc = cbFunc;
}

template &lt;typename T, typename U&gt;
T&amp; CBMember&lt;T, U&gt;::operator= (const T&amp; value)
{
    if (_parent &amp;&amp; _cbFunc)
        member = (_parent-&gt;*_cbFunc)(value);
    else
        member = value;

    return member;
}

template &lt;typename T, typename U&gt;
T CBMember&lt;T, U&gt;::operator() () const
{
    return member;
}

template &lt;typename T, typename U&gt;
std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const CBMember&lt;T, U&gt;&amp; cb)
{
    os &lt;&lt; cb.member;

    return os;
}

class A
{
public:
    typedef CBMember&lt;int, A&gt; CBint;

    A ();

    CBint x;
    int xCBFunc (const int&amp; newx);
};

A::A ()
{
    x.init(this, &amp;A::xcb);
}

int A::xcb (const int&amp; newx)
{
// zum Beispiel...
   int tmp;
   std::cout &lt;&lt; &quot;Mein x (im Moment &quot; &lt;&lt; x &lt;&lt; &quot;) wird gerade zu &quot; &lt;&lt; newx &lt;&lt; &quot; geaendert.&quot; &lt;&lt; std::endl;
   tmp = newx;
   return tmp;
}
</code></pre>
<p>Ja... funktionieren tut das. Geht das auch irgendwie schoener? Oder ist das generell nicht gut, sowas zu machen?</p>
<p>Gruesse,<br />
jehu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/214188/variablen-mit-callback</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 19:23:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/214188.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 May 2008 17:04:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variablen mit Callback on Mon, 26 May 2008 17:04:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin auf der Suche nach einer Methode, diese get/set Funktionen in Klassen zu vermeiden, weil die doch ziemlich laestig sind. Andererseits moechte ich schon, dass Variablen nicht ohne Wissen der Klasse einfach geaendert werden koennen.</p>
<p>Mein Ansatz war nun folgender:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U&gt;
class CBMember;

template &lt;typename T, typename U&gt;
std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const CBMember&lt;T, U&gt;&amp; cb);

template &lt;typename T, typename U&gt;
class CBMember
{
public:
    CBMember ();

    void init (U* parent, T (U::*cbFunc)(const T&amp; value));

    T&amp; operator= (const T&amp; value);
    T operator() () const;

    friend std::ostream&amp; operator&lt;&lt; &lt;&gt; (std::ostream&amp; os, const CBMember&lt;T, U&gt;&amp; cb);

private:
    U* _parent;
    T (U::*_cbFunc)(const T&amp; value);

    T member;
};

template &lt;typename T, typename U&gt;
CBMember&lt;T, U&gt;::CBMember () : _parent(0), _cbFunc(0)
{
}

template &lt;typename T, typename U&gt;
void CBMember&lt;T, U&gt;::init (U* parent, T (U::*cbFunc)(const T&amp; value))
{
    _parent = parent;
    _cbFunc = cbFunc;
}

template &lt;typename T, typename U&gt;
T&amp; CBMember&lt;T, U&gt;::operator= (const T&amp; value)
{
    if (_parent &amp;&amp; _cbFunc)
        member = (_parent-&gt;*_cbFunc)(value);
    else
        member = value;

    return member;
}

template &lt;typename T, typename U&gt;
T CBMember&lt;T, U&gt;::operator() () const
{
    return member;
}

template &lt;typename T, typename U&gt;
std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const CBMember&lt;T, U&gt;&amp; cb)
{
    os &lt;&lt; cb.member;

    return os;
}

class A
{
public:
    typedef CBMember&lt;int, A&gt; CBint;

    A ();

    CBint x;
    int xCBFunc (const int&amp; newx);
};

A::A ()
{
    x.init(this, &amp;A::xcb);
}

int A::xcb (const int&amp; newx)
{
// zum Beispiel...
   int tmp;
   std::cout &lt;&lt; &quot;Mein x (im Moment &quot; &lt;&lt; x &lt;&lt; &quot;) wird gerade zu &quot; &lt;&lt; newx &lt;&lt; &quot; geaendert.&quot; &lt;&lt; std::endl;
   tmp = newx;
   return tmp;
}
</code></pre>
<p>Ja... funktionieren tut das. Geht das auch irgendwie schoener? Oder ist das generell nicht gut, sowas zu machen?</p>
<p>Gruesse,<br />
jehu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1517087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1517087</guid><dc:creator><![CDATA[jehu]]></dc:creator><pubDate>Mon, 26 May 2008 17:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen mit Callback on Mon, 26 May 2008 19:07:46 GMT]]></title><description><![CDATA[<p>Ich hab mir auch mal so ein Teil gebastelt, bin aber nicht dazu gekommen, das wirklich ausführlich zu testen. Vielleicht funktionierts ja:</p>
<pre><code class="language-cpp">template &lt;class Var, class C&gt;
class Property
{
public:
	Property(C&amp; p) : parent(p)
	{}

	Property(C&amp; p, Var init) : parent(p), var(init)
	{}

	Var&amp; operator=(const Var&amp; val)
	{
		if (parent.PropertyCallback(*this, val, var))
			var = val;
	}

	operator Var&amp;()
	{
		return var;
	}

private:
	Var var;
	C&amp; parent;
};

class Test
{
	public:
		Property&lt;int,Test&gt; intProp;

		bool PropertyCallback(Property&lt;int,Test&gt;&amp; prop, int newVal, int oldVal)
		{
			std::cout &lt;&lt; &quot;Property callback: &quot; &lt;&lt; oldVal &lt;&lt; &quot; &quot; &lt;&lt; newVal &lt;&lt; '\n';
		}

		Test() : intProp(*this, 0)
		{	}
};

int main()
{
	Test t;

	t.intProp = 1;

	std::cout &lt;&lt; t.intProp;

}
</code></pre>
<p>Die umfassende Klasse muss nur ein bool PropertyCallback(Property&lt;C,Var&gt;, Var neu, Var alt) haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1517186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1517186</guid><dc:creator><![CDATA[DerKuchen]]></dc:creator><pubDate>Mon, 26 May 2008 19:07:46 GMT</pubDate></item></channel></rss>