<?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[Probleme bei OOP mit Boost::Signals]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe zurzeit ein Framework oder so :), für 2D Games mit SFML.<br />
Für Signals und Slots habe ich boost gewählt und da hab ich ein Problemm.</p>
<p>Hier ist mal der Code den ich vereinfacht nachgebaut habe:</p>
<pre><code class="language-cpp">// Item.h

#ifndef ITEM
#define ITEM

#include &lt;boost/signals.hpp&gt; 
#include &lt;boost/bind.hpp&gt;

class Item{

public:
	typedef boost::signal&lt;void(int)&gt; MySlot;
	MySlot mySlot;

	void SetClick(MySlot::slot_function_type sf);	
	void Click();

	Item();
};

#endif
</code></pre>
<pre><code class="language-cpp">// Item.cpp

#include &quot;Item.h&quot;

Item::Item(){
}

void Item::SetClick(MySlot::slot_function_type sf){
	mySlot.connect(sf);
}

void Item::Click(){
	mySlot(1);
}
</code></pre>
<pre><code class="language-cpp">// Gui.h

#ifndef GUI
#define GUI

#include &quot;Item.h&quot;
#include &lt;vector&gt;

class App;

class Gui{

public:
	std::vector&lt;Item*&gt; items;

	App *parent;

	void SetParent(App *parent_);
	void AddItem(Item *item_);
	Item *GetItem(int index);
	void GuiClose(int gui_do = -1);

};

#endif
</code></pre>
<pre><code class="language-cpp">// Gui.cpp

#include &quot;Gui.h&quot;
#include &quot;App.h&quot;

void Gui::SetParent(App *parent_){
	parent = parent_;
}

void Gui::AddItem(Item *item_){
	items.push_back(item_);
}

Item *Gui::GetItem(int index){
	return items[index];
}

void Gui::GuiClose(int gui_do){
	parent-&gt;SetIndex(gui_do);
}
</code></pre>
<pre><code class="language-cpp">// App.h

#ifndef APP
#define APP

#include &lt;vector&gt;
#include &quot;Gui.h&quot;
#include &lt;iostream&gt;

class App{

public:
	std::vector&lt;Gui*&gt; guis;
	Gui *gui;
	int index;

	void AddGui(Gui *gui_);
	void SetIndex(int index_);
	void Run(int index_);
};

#endif
</code></pre>
<pre><code class="language-cpp">// App.cpp

#include &quot;App.h&quot;

void App::AddGui(Gui *gui_){
	gui_-&gt;SetParent(this);
	guis.push_back(gui_);
}

void App::SetIndex(int index_){
	index = index_;
	std::cout &lt;&lt; index_ &lt;&lt; std::endl;
}

void App::Run(int index_){
	index = index_;
	gui = guis[index];

	Item *item = gui-&gt;GetItem(0);
	item-&gt;Click();

	//gui-&gt;GuiClose(200);
}
</code></pre>
<pre><code class="language-cpp">// main.cpp

#include &quot;Item.h&quot;
#include &quot;Gui.h&quot;
#include &quot;App.h&quot;

#include &lt;boost/bind.hpp&gt; 

int main(){

	Gui *gui0 = new Gui();
	{
		Item *item0 = new Item();
		Item *item1 = new Item();
		Item *item2 = new Item();
		gui0-&gt;AddItem(item0);
		gui0-&gt;AddItem(item1);
		gui0-&gt;AddItem(item2);

		item0-&gt;SetClick( boost::bind(&amp;Gui::GuiClose, *gui0, 10) );
	}

	Gui *gui1 = new Gui();
	{
		Item *item0 = new Item();
		Item *item1 = new Item();
		Item *item2 = new Item();
		gui1-&gt;AddItem(item0);
		gui1-&gt;AddItem(item1);
		gui1-&gt;AddItem(item2);
	}

	App app;
	app.AddGui(gui0);
	app.AddGui(gui1);

	app.Run(0);

	return 0;
}
</code></pre>
<p>In &quot;main.cpp&quot; Zeile 21 connecte ich die Methode &quot;Gui::GuiClose()&quot; die ich später in &quot;App::Run()&quot; über die Methode &quot;Item::Click()&quot; aufrufe. Die Methode &quot;Gui::GuiClose()&quot; greift auf die Methode &quot;App::SetIndex()&quot; über den &quot;parent&quot; und da hab ich das Problem. Der &quot;parent&quot; ist &quot;NULL&quot; obwohl ich diesen in der Methode &quot;App::AddGui()&quot; setze.<br />
Wenn ich &quot;Gui::GuiClose()&quot; ohne das connecten aufrufe dan ist der &quot;parent&quot; nicht NULL.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277219/probleme-bei-oop-mit-boost-signals</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 01:49:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277219.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Nov 2010 01:55:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme bei OOP mit Boost::Signals on Mon, 15 Nov 2010 01:55:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe zurzeit ein Framework oder so :), für 2D Games mit SFML.<br />
Für Signals und Slots habe ich boost gewählt und da hab ich ein Problemm.</p>
<p>Hier ist mal der Code den ich vereinfacht nachgebaut habe:</p>
<pre><code class="language-cpp">// Item.h

#ifndef ITEM
#define ITEM

#include &lt;boost/signals.hpp&gt; 
#include &lt;boost/bind.hpp&gt;

class Item{

public:
	typedef boost::signal&lt;void(int)&gt; MySlot;
	MySlot mySlot;

	void SetClick(MySlot::slot_function_type sf);	
	void Click();

	Item();
};

#endif
</code></pre>
<pre><code class="language-cpp">// Item.cpp

#include &quot;Item.h&quot;

Item::Item(){
}

void Item::SetClick(MySlot::slot_function_type sf){
	mySlot.connect(sf);
}

void Item::Click(){
	mySlot(1);
}
</code></pre>
<pre><code class="language-cpp">// Gui.h

#ifndef GUI
#define GUI

#include &quot;Item.h&quot;
#include &lt;vector&gt;

class App;

class Gui{

public:
	std::vector&lt;Item*&gt; items;

	App *parent;

	void SetParent(App *parent_);
	void AddItem(Item *item_);
	Item *GetItem(int index);
	void GuiClose(int gui_do = -1);

};

#endif
</code></pre>
<pre><code class="language-cpp">// Gui.cpp

#include &quot;Gui.h&quot;
#include &quot;App.h&quot;

void Gui::SetParent(App *parent_){
	parent = parent_;
}

void Gui::AddItem(Item *item_){
	items.push_back(item_);
}

Item *Gui::GetItem(int index){
	return items[index];
}

void Gui::GuiClose(int gui_do){
	parent-&gt;SetIndex(gui_do);
}
</code></pre>
<pre><code class="language-cpp">// App.h

#ifndef APP
#define APP

#include &lt;vector&gt;
#include &quot;Gui.h&quot;
#include &lt;iostream&gt;

class App{

public:
	std::vector&lt;Gui*&gt; guis;
	Gui *gui;
	int index;

	void AddGui(Gui *gui_);
	void SetIndex(int index_);
	void Run(int index_);
};

#endif
</code></pre>
<pre><code class="language-cpp">// App.cpp

#include &quot;App.h&quot;

void App::AddGui(Gui *gui_){
	gui_-&gt;SetParent(this);
	guis.push_back(gui_);
}

void App::SetIndex(int index_){
	index = index_;
	std::cout &lt;&lt; index_ &lt;&lt; std::endl;
}

void App::Run(int index_){
	index = index_;
	gui = guis[index];

	Item *item = gui-&gt;GetItem(0);
	item-&gt;Click();

	//gui-&gt;GuiClose(200);
}
</code></pre>
<pre><code class="language-cpp">// main.cpp

#include &quot;Item.h&quot;
#include &quot;Gui.h&quot;
#include &quot;App.h&quot;

#include &lt;boost/bind.hpp&gt; 

int main(){

	Gui *gui0 = new Gui();
	{
		Item *item0 = new Item();
		Item *item1 = new Item();
		Item *item2 = new Item();
		gui0-&gt;AddItem(item0);
		gui0-&gt;AddItem(item1);
		gui0-&gt;AddItem(item2);

		item0-&gt;SetClick( boost::bind(&amp;Gui::GuiClose, *gui0, 10) );
	}

	Gui *gui1 = new Gui();
	{
		Item *item0 = new Item();
		Item *item1 = new Item();
		Item *item2 = new Item();
		gui1-&gt;AddItem(item0);
		gui1-&gt;AddItem(item1);
		gui1-&gt;AddItem(item2);
	}

	App app;
	app.AddGui(gui0);
	app.AddGui(gui1);

	app.Run(0);

	return 0;
}
</code></pre>
<p>In &quot;main.cpp&quot; Zeile 21 connecte ich die Methode &quot;Gui::GuiClose()&quot; die ich später in &quot;App::Run()&quot; über die Methode &quot;Item::Click()&quot; aufrufe. Die Methode &quot;Gui::GuiClose()&quot; greift auf die Methode &quot;App::SetIndex()&quot; über den &quot;parent&quot; und da hab ich das Problem. Der &quot;parent&quot; ist &quot;NULL&quot; obwohl ich diesen in der Methode &quot;App::AddGui()&quot; setze.<br />
Wenn ich &quot;Gui::GuiClose()&quot; ohne das connecten aufrufe dan ist der &quot;parent&quot; nicht NULL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1980553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1980553</guid><dc:creator><![CDATA[ghostboss]]></dc:creator><pubDate>Mon, 15 Nov 2010 01:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei OOP mit Boost::Signals on Mon, 15 Nov 2010 08:37:47 GMT]]></title><description><![CDATA[<p>ghostboss schrieb:</p>
<blockquote>
<pre><code class="language-cpp">item0-&gt;SetClick( boost::bind(&amp;Gui::GuiClose, *gui0, 10) );
</code></pre>
</blockquote>
<p>Hier wird eine Kopie von *gui0 erstellt. Und diese Kopie wird niemals App hinzugefügt.</p>
<p>Dies sollte Abhilfe schaffen:</p>
<pre><code class="language-cpp">boost::ref(*gui0)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1980611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1980611</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 15 Nov 2010 08:37:47 GMT</pubDate></item></channel></rss>