<?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[Problem mit einem Zeigerzugriff]]></title><description><![CDATA[<p>das problem ist folgendes:<br />
wenn ich ein objekt von infantry anlege:</p>
<pre><code class="language-cpp">Unit *unit = new Unit(&quot;Boyz&quot;, &quot;Nahkämpfer&quot;, 265, 6);
	AbstractInfantry *ai = new AbstractInfantry(2);
	ai-&gt;setOwner(unit);
	Infantry *model1 = new Infantry(ai);
	model1-&gt;setOwner(unit);
</code></pre>
<p>dann muss bzw. will ich später einen zeiger auf eine einheit der das model anghört setzen. dazu habe ich in der klasse model die funktionen setOwner implementiert.</p>
<p>laut ausgabe von meinem programm (das natürlich abstürzt) bekomme ich aber folgendes bei einer abfrage der adresse:</p>
<pre><code>OWNER-Abstr: 0x8115498 (durch das ai-&gt;setOwner(unit);)
OWNER-Model: 0x8115498 (durch das model1-&gt;setOwner(unit);)
OWNER-Abstr: 0x8115498 (durch das model1-&gt;setOwner(unit);)
0x8115498 (std::cout&lt;&lt;unit&lt;&lt;std::endl;)

der rest durch die eigentliche model-&gt;abfrage...
get OWNER-Abstr: 0x8116978
get OWNER-Model: 0x8116978
get OWNER-Abstr: 0x8116978
0x8116978
</code></pre>
<p>bei dieser abfrage:</p>
<pre><code class="language-cpp">std::cout&lt;&lt;unit&lt;&lt;std::endl;
 	std::cout&lt;&lt;model1-&gt;owner()&lt;&lt;std::endl;
</code></pre>
<pre><code class="language-cpp">class AbstractModel
{
	public:
		//hat in abstr. klassen nix zu suchen
// 		AbstractModel();

		void setOwner(Unit *owner) {std::cout&lt;&lt;&quot;OWNER-Abstr: &quot;&lt;&lt;owner&lt;&lt;std::endl; /*own_un = owner;*/};
		void setOwner(int owner) {own_id = owner;};

		int inline owner_id() {return own_id;};			// Unit-ID der Einheit der das Modell angehoert
		Unit inline *owner() {std::cout&lt;&lt;&quot;get OWNER-Abstr: &quot;&lt;&lt;own_un&lt;&lt;std::endl; return own_un;};			// Zeiger auf Einheit der das Modell angehoert

	private:
		Unit* own_un;
		int own_id;
};

class AbstractInfantry : public AbstractModel
{
	public:
		AbstractInfantry(double d) {base_diam = d;};
		double inline size() {return base_diam;};		// Base-Durchmesser

	private:
		double base_diam;
};

class Model
{
	public:
// 		Model(AbstractModel* base) {m = base;};				// Konstruktor aus bestehendem AbstractModel
// 		Model(Model* base) {this = base;};				// Konstruktor aus bestehendem AbstractModel

		void	inline	select(bool s)	{sel = s;};
		bool	inline	selected() {return sel;};			// ist das Modell gerade selektiert?
		void	inline	sMove(bool m)	{mov = m;};
		bool	inline	moving() {return mov;};				// wird das Modell gerade bewegt?
		int	inline	owner_id() {return m-&gt;owner_id();}	;	// Unit-ID der Einheit der das Modell angehoert
		QPointF	inline	position() {return pos;};			// Position des Modells auf dem Schlachtfeld, in Zollkoordinaten
		void	inline	setOwner(Unit *o) {std::cout&lt;&lt;&quot;OWNER-Model: &quot;&lt;&lt;o&lt;&lt;std::endl; m-&gt;setOwner(o);};
		Unit	inline	*owner()   {std::cout&lt;&lt;&quot;get OWNER-Model: &quot;&lt;&lt;m-&gt;owner()&lt;&lt;std::endl; return m-&gt;owner();};		// Zeiger auf Einheit der das Modell angehoert
		void	inline	move(double x, double y) {pos.setX(pos.x() + x); pos.setY(pos.y() + y);};		// relative Bewegung
		void	inline	set_position(double x, double y) {pos.setX(pos.x() + x); pos.setY(pos.y() + y);};	// absolute Positionsaenderung
		void	inline	set_position(QPointF p) {pos.setX(p.x()); pos.setY(p.y());};	// absolute Positionsaenderung

		virtual EModelType type() = 0;
		virtual double size() = 0;
		virtual double angle()= 0;
		virtual double height() = 0;
		virtual double width() = 0;
		virtual void face(double a) = 0;
		virtual void turn(double a) = 0;
		virtual void sTurn(bool t) = 0;
		virtual bool turning() = 0;

	private:
		QPointF pos;
		bool sel;
		bool mov;

		AbstractModel* m;
};

/* zusaetzliche Eigenschaften fuer auf dem Schlachtfeld befindliche Laeufer */
class Infantry : public Model
{
	public:
		Infantry(AbstractInfantry* base) {m = base;};

		double		inline	size()	{return m-&gt;size();};

		EModelType inline type() { return MT_INFANTRY; };

		double angle() {return -1;};
		double height() {return -1;};
		double width() {return -1;};
		void face(double a) {};
		void turn(double a) {};
		void sTurn(bool t) {};
		bool turning() {return -1;};

	private:
		AbstractInfantry* m;
};
</code></pre>
<p>was mich wundert ist, dass der zeiger auf die unit anscheinend nicht korrekt gespeichert wird und mir nicht völlig klar ist wie man das richten kann. kurioserweise hat dieser code solange funktioniert, bis ein bekannter einen absturz bekam und dann funktionierte es bei mir auch nicht mehr... sehr seltsam?!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201040/problem-mit-einem-zeigerzugriff</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 12:27:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201040.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Dec 2007 15:08:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit einem Zeigerzugriff on Sun, 23 Dec 2007 15:08:25 GMT]]></title><description><![CDATA[<p>das problem ist folgendes:<br />
wenn ich ein objekt von infantry anlege:</p>
<pre><code class="language-cpp">Unit *unit = new Unit(&quot;Boyz&quot;, &quot;Nahkämpfer&quot;, 265, 6);
	AbstractInfantry *ai = new AbstractInfantry(2);
	ai-&gt;setOwner(unit);
	Infantry *model1 = new Infantry(ai);
	model1-&gt;setOwner(unit);
</code></pre>
<p>dann muss bzw. will ich später einen zeiger auf eine einheit der das model anghört setzen. dazu habe ich in der klasse model die funktionen setOwner implementiert.</p>
<p>laut ausgabe von meinem programm (das natürlich abstürzt) bekomme ich aber folgendes bei einer abfrage der adresse:</p>
<pre><code>OWNER-Abstr: 0x8115498 (durch das ai-&gt;setOwner(unit);)
OWNER-Model: 0x8115498 (durch das model1-&gt;setOwner(unit);)
OWNER-Abstr: 0x8115498 (durch das model1-&gt;setOwner(unit);)
0x8115498 (std::cout&lt;&lt;unit&lt;&lt;std::endl;)

der rest durch die eigentliche model-&gt;abfrage...
get OWNER-Abstr: 0x8116978
get OWNER-Model: 0x8116978
get OWNER-Abstr: 0x8116978
0x8116978
</code></pre>
<p>bei dieser abfrage:</p>
<pre><code class="language-cpp">std::cout&lt;&lt;unit&lt;&lt;std::endl;
 	std::cout&lt;&lt;model1-&gt;owner()&lt;&lt;std::endl;
</code></pre>
<pre><code class="language-cpp">class AbstractModel
{
	public:
		//hat in abstr. klassen nix zu suchen
// 		AbstractModel();

		void setOwner(Unit *owner) {std::cout&lt;&lt;&quot;OWNER-Abstr: &quot;&lt;&lt;owner&lt;&lt;std::endl; /*own_un = owner;*/};
		void setOwner(int owner) {own_id = owner;};

		int inline owner_id() {return own_id;};			// Unit-ID der Einheit der das Modell angehoert
		Unit inline *owner() {std::cout&lt;&lt;&quot;get OWNER-Abstr: &quot;&lt;&lt;own_un&lt;&lt;std::endl; return own_un;};			// Zeiger auf Einheit der das Modell angehoert

	private:
		Unit* own_un;
		int own_id;
};

class AbstractInfantry : public AbstractModel
{
	public:
		AbstractInfantry(double d) {base_diam = d;};
		double inline size() {return base_diam;};		// Base-Durchmesser

	private:
		double base_diam;
};

class Model
{
	public:
// 		Model(AbstractModel* base) {m = base;};				// Konstruktor aus bestehendem AbstractModel
// 		Model(Model* base) {this = base;};				// Konstruktor aus bestehendem AbstractModel

		void	inline	select(bool s)	{sel = s;};
		bool	inline	selected() {return sel;};			// ist das Modell gerade selektiert?
		void	inline	sMove(bool m)	{mov = m;};
		bool	inline	moving() {return mov;};				// wird das Modell gerade bewegt?
		int	inline	owner_id() {return m-&gt;owner_id();}	;	// Unit-ID der Einheit der das Modell angehoert
		QPointF	inline	position() {return pos;};			// Position des Modells auf dem Schlachtfeld, in Zollkoordinaten
		void	inline	setOwner(Unit *o) {std::cout&lt;&lt;&quot;OWNER-Model: &quot;&lt;&lt;o&lt;&lt;std::endl; m-&gt;setOwner(o);};
		Unit	inline	*owner()   {std::cout&lt;&lt;&quot;get OWNER-Model: &quot;&lt;&lt;m-&gt;owner()&lt;&lt;std::endl; return m-&gt;owner();};		// Zeiger auf Einheit der das Modell angehoert
		void	inline	move(double x, double y) {pos.setX(pos.x() + x); pos.setY(pos.y() + y);};		// relative Bewegung
		void	inline	set_position(double x, double y) {pos.setX(pos.x() + x); pos.setY(pos.y() + y);};	// absolute Positionsaenderung
		void	inline	set_position(QPointF p) {pos.setX(p.x()); pos.setY(p.y());};	// absolute Positionsaenderung

		virtual EModelType type() = 0;
		virtual double size() = 0;
		virtual double angle()= 0;
		virtual double height() = 0;
		virtual double width() = 0;
		virtual void face(double a) = 0;
		virtual void turn(double a) = 0;
		virtual void sTurn(bool t) = 0;
		virtual bool turning() = 0;

	private:
		QPointF pos;
		bool sel;
		bool mov;

		AbstractModel* m;
};

/* zusaetzliche Eigenschaften fuer auf dem Schlachtfeld befindliche Laeufer */
class Infantry : public Model
{
	public:
		Infantry(AbstractInfantry* base) {m = base;};

		double		inline	size()	{return m-&gt;size();};

		EModelType inline type() { return MT_INFANTRY; };

		double angle() {return -1;};
		double height() {return -1;};
		double width() {return -1;};
		void face(double a) {};
		void turn(double a) {};
		void sTurn(bool t) {};
		bool turning() {return -1;};

	private:
		AbstractInfantry* m;
};
</code></pre>
<p>was mich wundert ist, dass der zeiger auf die unit anscheinend nicht korrekt gespeichert wird und mir nicht völlig klar ist wie man das richten kann. kurioserweise hat dieser code solange funktioniert, bis ein bekannter einen absturz bekam und dann funktionierte es bei mir auch nicht mehr... sehr seltsam?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425207</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Sun, 23 Dec 2007 15:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit einem Zeigerzugriff on Sun, 23 Dec 2007 15:14:37 GMT]]></title><description><![CDATA[<p>Vielleicht solltest du <code>own_un = owner;</code> in <code>void AbstractModel::setOwner(Unit *owner)</code> nicht auskommentieren?<br />
Und evtl solltest du auch dein Klassendesign überdenken, da man eigentlich keine Instanz von einer abstrakten Klasse erstellen sollte. Gut, AbstractInfantry ist nicht abstrakt, aber der Name der Klasse impliziert das...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425211</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 23 Dec 2007 15:14:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit einem Zeigerzugriff on Sun, 23 Dec 2007 15:52:40 GMT]]></title><description><![CDATA[<p>ARGH, bin ich dumm, aber man wird halt betriebsblind... ): man sucht stunden und wundert sich, aber nix kommt raus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425226</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Sun, 23 Dec 2007 15:52:40 GMT</pubDate></item></channel></rss>