<?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[CopiedPointer...]]></title><description><![CDATA[<p>Ich habe mir eine Autopointerklasse geschrieben udn sie gibt mir beim Kompilieren eines Beispiels einen Fehler... Warum?</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class CopiedPointer_
{
protected:
   T* pointer_;

public:
   // Standartd Konstruktor
   CopiedPointer_(void) : pointer_(0)
   {
   }

   CopiedPointer_(T* pointer) : pointer_(pointer)
   {
   }

   // Copy-Konstruktor
   CopiedPointer_(const CopiedPointer_&lt;T&gt;&amp; copied_pointer)
   : pointer_(copied_pointer.is_zero() ? 0 : new T(*copied_pointer.pointer_))
   {
   }

   // Destruktor
   ~CopiedPointer_(void)
   {
      delete pointer_;
   }

   // Assignment Operator
   CopiedPointer_&lt;T&gt;&amp; operator =(T* pointer)
   {
      // alten Zeiger löschen
      delete pointer;
      // neuen zuweisen
      pointer_ = pointer;

      return(*this);
   }

   // Assignment Operator
   CopiedPointer_&lt;T&gt;&amp; operator =(const CopiedPointer_&lt;T&gt;&amp; copied_pointer)
   {
      // prüfen, das nicht dasselbe Objekt übergeben wurde
      if(pointer_ != copied_pointer.pointer_)
      {
         delete pointer_;

         // wenn die Refernez 0 ist, wird pointer auch auf 0 gesetzt
         pointer_ = copied_pointer.is_zero() ? 0 : new T(copied_pointer.pointer_);
      }

      return(*this);
   }

   // Operator gibt Addresse des Zeigers zurück
   T&amp; operator *(void) const
   {
      return(*pointer_);
   }

   // prüft, ob Zeiger ins leere Zeigt und somit leer ist
   bool is_zero(void) const
   {
      return(pointer_ == 0);
   }

   void zero(void)
   {

      delete pointer_;
      pointer_ = 0;
   }

   // Vergleichsoperator
   friend bool operator==(const CopiedPointer_&lt;T&gt;&amp; copied_pointer_a,
                          const CopiedPointer_&lt;T&gt;&amp; copied_pointer_b)
   {
      return(copied_pointer_a.pointer_ == copied_pointer_b.pointer_);
   }

   // Vergleichsoperator
   friend bool operator!=(const CopiedPointer_&lt;T&gt;&amp; copied_pointer_a,
                          const CopiedPointer_&lt;T&gt;&amp; copied_pointer_b)
   {
      return(copied_pointer_a != copied_pointer_b);
   }
};

template&lt;class T&gt;
class CopiedPointer : public CopiedPointer_&lt;T&gt;
{
public:
   // Konstruktor
   CopiedPointer(void) : CopiedPointer_&lt;T&gt;()
   {
   }

   // Copy-Konstruktor
   CopiedPointer(const CopiedPointer&lt;T&gt;&amp; copied_pointer) : CopiedPointer_&lt;T&gt;(copied_pointer)
   {
   }

   // Assignment Operator
   CopiedPointer&lt;T&gt;&amp; operator =(T* pointer)
   {
      CopiedPointer_&lt;T&gt;::operator =(pointer);

      return(*this);
   }

   // Assignment Operator
   CopiedPointer&lt;T&gt;&amp; operator =(const CopiedPointer&lt;T&gt;&amp; copied_pointer)
   {
      CopiedPointer_&lt;T&gt;::operator =(copied_pointer);

      return(*this);
   }

   T* operator-&gt;(void) const
   {
      return(pointer_);
   }
};
</code></pre>
<pre><code class="language-cpp">#include &quot;CopiedPointer.hpp&quot;
#include &lt;iostream&gt;
using namespace std;

struct test
{
	int a_, b_;

	test(void) : a_(0), b_(0)
	{

	}

	test(int a, int b) : a_(a), b_(b)
	{

	}

};

int main(void)
{
	CopiedPointer&lt;test&gt; ptr = new test(1, 5);

	cin.get();
	return 0;
}
</code></pre>
<pre><code>Fehlermeldung:
error C2440: 'Initialisierung': 'test *' kann nicht in 'CopiedPointer&lt;T&gt;' konvertiert werden
1&gt;        with
1&gt;        [
1&gt;            T=test
1&gt;        ]
1&gt;        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/179603/copiedpointer</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 08:20:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179603.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Apr 2007 15:29:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CopiedPointer... on Mon, 23 Apr 2007 15:29:35 GMT]]></title><description><![CDATA[<p>Ich habe mir eine Autopointerklasse geschrieben udn sie gibt mir beim Kompilieren eines Beispiels einen Fehler... Warum?</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class CopiedPointer_
{
protected:
   T* pointer_;

public:
   // Standartd Konstruktor
   CopiedPointer_(void) : pointer_(0)
   {
   }

   CopiedPointer_(T* pointer) : pointer_(pointer)
   {
   }

   // Copy-Konstruktor
   CopiedPointer_(const CopiedPointer_&lt;T&gt;&amp; copied_pointer)
   : pointer_(copied_pointer.is_zero() ? 0 : new T(*copied_pointer.pointer_))
   {
   }

   // Destruktor
   ~CopiedPointer_(void)
   {
      delete pointer_;
   }

   // Assignment Operator
   CopiedPointer_&lt;T&gt;&amp; operator =(T* pointer)
   {
      // alten Zeiger löschen
      delete pointer;
      // neuen zuweisen
      pointer_ = pointer;

      return(*this);
   }

   // Assignment Operator
   CopiedPointer_&lt;T&gt;&amp; operator =(const CopiedPointer_&lt;T&gt;&amp; copied_pointer)
   {
      // prüfen, das nicht dasselbe Objekt übergeben wurde
      if(pointer_ != copied_pointer.pointer_)
      {
         delete pointer_;

         // wenn die Refernez 0 ist, wird pointer auch auf 0 gesetzt
         pointer_ = copied_pointer.is_zero() ? 0 : new T(copied_pointer.pointer_);
      }

      return(*this);
   }

   // Operator gibt Addresse des Zeigers zurück
   T&amp; operator *(void) const
   {
      return(*pointer_);
   }

   // prüft, ob Zeiger ins leere Zeigt und somit leer ist
   bool is_zero(void) const
   {
      return(pointer_ == 0);
   }

   void zero(void)
   {

      delete pointer_;
      pointer_ = 0;
   }

   // Vergleichsoperator
   friend bool operator==(const CopiedPointer_&lt;T&gt;&amp; copied_pointer_a,
                          const CopiedPointer_&lt;T&gt;&amp; copied_pointer_b)
   {
      return(copied_pointer_a.pointer_ == copied_pointer_b.pointer_);
   }

   // Vergleichsoperator
   friend bool operator!=(const CopiedPointer_&lt;T&gt;&amp; copied_pointer_a,
                          const CopiedPointer_&lt;T&gt;&amp; copied_pointer_b)
   {
      return(copied_pointer_a != copied_pointer_b);
   }
};

template&lt;class T&gt;
class CopiedPointer : public CopiedPointer_&lt;T&gt;
{
public:
   // Konstruktor
   CopiedPointer(void) : CopiedPointer_&lt;T&gt;()
   {
   }

   // Copy-Konstruktor
   CopiedPointer(const CopiedPointer&lt;T&gt;&amp; copied_pointer) : CopiedPointer_&lt;T&gt;(copied_pointer)
   {
   }

   // Assignment Operator
   CopiedPointer&lt;T&gt;&amp; operator =(T* pointer)
   {
      CopiedPointer_&lt;T&gt;::operator =(pointer);

      return(*this);
   }

   // Assignment Operator
   CopiedPointer&lt;T&gt;&amp; operator =(const CopiedPointer&lt;T&gt;&amp; copied_pointer)
   {
      CopiedPointer_&lt;T&gt;::operator =(copied_pointer);

      return(*this);
   }

   T* operator-&gt;(void) const
   {
      return(pointer_);
   }
};
</code></pre>
<pre><code class="language-cpp">#include &quot;CopiedPointer.hpp&quot;
#include &lt;iostream&gt;
using namespace std;

struct test
{
	int a_, b_;

	test(void) : a_(0), b_(0)
	{

	}

	test(int a, int b) : a_(a), b_(b)
	{

	}

};

int main(void)
{
	CopiedPointer&lt;test&gt; ptr = new test(1, 5);

	cin.get();
	return 0;
}
</code></pre>
<pre><code>Fehlermeldung:
error C2440: 'Initialisierung': 'test *' kann nicht in 'CopiedPointer&lt;T&gt;' konvertiert werden
1&gt;        with
1&gt;        [
1&gt;            T=test
1&gt;        ]
1&gt;        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1271842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271842</guid><dc:creator><![CDATA[g--.]]></dc:creator><pubDate>Mon, 23 Apr 2007 15:29:35 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Mon, 23 Apr 2007 15:43:46 GMT]]></title><description><![CDATA[<p>Eine Konstruktion mit Zuweisung ist äquivalent mit einer direkten Konstruktion. Der Compiler liest in dieser Zeile also:</p>
<pre><code class="language-cpp">CopiedPointer&lt;test&gt; ptr( new test(1, 5) );
</code></pre>
<p>Versuch mal folgendes, das müsste mit der derzeitigen Klasse funktionieren:</p>
<pre><code class="language-cpp">CopiedPointer&lt;test&gt; ptr;
ptr = new test(1, 5);
</code></pre>
<p>Das aber nur als Erklärung, eleganter ist sicherlich die Initialisierung wie sie jetzt ist. Damit <strong>die</strong> funktioniert, musst Du Deiner Klasse noch einen Konstruktor spendieren, der als Parameter ein T* entgegennimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271849</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 23 Apr 2007 15:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Mon, 23 Apr 2007 15:49:56 GMT]]></title><description><![CDATA[<p>Ok, ich habe den Konstruktor in der CopiedPointer Klasse tatsächlich vergessen, aber vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271855</guid><dc:creator><![CDATA[g--.]]></dc:creator><pubDate>Mon, 23 Apr 2007 15:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Mon, 23 Apr 2007 18:27:14 GMT]]></title><description><![CDATA[<p>Hier sind mehrere Sachen unglücklich oder gefährlich. Was allerdings auffällt, ist der fehlende Sinn der Vergleichsoperatoren. Beim jetzigen Design dürfen zwei deiner Zeiger sowieso nur gleich sein, wenn du den Zeiger mit sich selbst vergleichst (es sei denn beide sind leer), andernfalls hast du es später mit einem doppelten delete zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271951</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 23 Apr 2007 18:27:14 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 00:43:36 GMT]]></title><description><![CDATA[<ol>
<li>wieso trennst du das in 2 Klassen auf?</li>
<li>wenn ein Template &quot;seinen eigenen Namen verwendet&quot;, dann brauchst du die Template Parameter nicht zu wiederholen:</li>
</ol>
<pre><code class="language-cpp">template&lt;class T&gt; struct a
{
    // a(a&lt;T&gt; const&amp; other);
    // kürzer:
    a(a const&amp; other);
};
</code></pre>
<ol start="3">
<li>der ctor mit &quot;T*&quot; als Argument sollte &quot;explicit&quot; sein, sonst kannst du da lustige Überraschungen erleben</li>
<li>der &quot;operator =&quot; mit &quot;T*&quot; ist ebenfalls gefährlich (mach ne &quot;.reset()&quot; Funktion stattdessen)</li>
<li>der operator != ist rekursiv (ruft sich selbst auf)</li>
<li>der Name &quot;zero&quot; ist IMHO unglücklich gewählt<br />
...</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1272099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272099</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 00:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 14:14:43 GMT]]></title><description><![CDATA[<p>Warum ist der operator= mit T* gefärhlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272497</guid><dc:creator><![CDATA[g--.]]></dc:creator><pubDate>Tue, 24 Apr 2007 14:14:43 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 14:17:56 GMT]]></title><description><![CDATA[<p>und warum ist der operator!= rekuriv?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272502</guid><dc:creator><![CDATA[g--.]]></dc:creator><pubDate>Tue, 24 Apr 2007 14:17:56 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 14:32:11 GMT]]></title><description><![CDATA[<p>g--. schrieb:</p>
<blockquote>
<p>und warum ist der operator!= rekuriv?</p>
</blockquote>
<p>Weil der operator!= die beiden Objekte auf Ungleichheit prüft, was den operator!= aufruft, welcher die beiden Objekte auf Ungleichheit prüft, was den operator!= aufruft, welcher die beiden Objekte auf Ungleichheit prüft, was den operator!= aufruft, welcher die beiden Objekte auf Ungleichheit prüft, was den operator!= aufruft, ....</p>
<p>EDIT:<br />
Meintest Du evtl.:</p>
<pre><code class="language-cpp">return !(copied_pointer_a == copied_pointer_b);
</code></pre>
<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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272511</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 24 Apr 2007 14:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 14:34:07 GMT]]></title><description><![CDATA[<p>Kann ich auch hier:</p>
<pre><code class="language-cpp">CopiedPointer&lt;T&gt;&amp; operator =(T* pointer)
</code></pre>
<p>das &lt;T&gt; weglassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272513</guid><dc:creator><![CDATA[g--.]]></dc:creator><pubDate>Tue, 24 Apr 2007 14:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 20:10:08 GMT]]></title><description><![CDATA[<p>Ich habe koch eine kleine Frage:</p>
<p>Wie kann ich den Vergleichsoperatoren überladen, sodass sie den Wert des Zeigers vergleichen? udn nicht die Adresse?</p>
<p>Problem ist ja dabei, das bei dem template der == und != Operator definiert sein muss? Oder gibt es irgendwelche umwege, wie ich zwei meiner CopiedPointer Objekte bezüglich der Werte des Zeigers vergleuchen kann?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272796</guid><dc:creator><![CDATA[g--.]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to CopiedPointer... on Tue, 24 Apr 2007 20:46:09 GMT]]></title><description><![CDATA[<p>Den &quot;operator = (T*)&quot; halte ich für gefährlich weil es dadurch eine Funktion gibt, die einen &quot;CopiedPointer&quot; als Argument nehmen kann oder auch einen &quot;rohen T*&quot;, deren Semantik sich aber in beiden Fällen unterscheidet.<br />
Wenn ein &quot;CopiedPointer&quot; übergeben wird wird dieser kopiert, wenn allerdings ein &quot;T*&quot; übergeben wird gibt man damit die Ownership ab.</p>
<p>2 Operationen gleichen namens die was grundlegend unterschiedliches machen... nicht gut.</p>
<p>Und ja, ich denke du kannst auch dort das &quot;&lt;T&gt;&quot; weglassen, probier es doch einfach aus.<br />
BTW: noch ein Fehler in deinem Code, nämlich genau im &quot;operator =(T*)&quot;:</p>
<pre><code class="language-cpp">CopiedPointer_&lt;T&gt;&amp; operator =(T* pointer)
   {
      // alten Zeiger löschen
      delete pointer; // ba-da-boom, falscher Zeiger gelöscht, da fehlt ein &quot;_&quot;
      // neuen zuweisen
      pointer_ = pointer;

      return(*this);
   }
</code></pre>
<p>Und: du kannst Objekte vergleichen wenn ein geeigneter &quot;operator ==&quot; definiert ist. Wenn nicht, dann nicht. Und auch nicht in deinem Template. Frag dich lieber ob du das überhaupt brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272825</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 20:46:09 GMT</pubDate></item></channel></rss>