<?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 std::list und auto_ptr]]></title><description><![CDATA[<p>Hallo</p>
<p>hab mein Programm das Ürsprünglich die Daten in eine std::list&lt;konto*&gt; gespeichert hat umgebaut zu std::set&lt;auto_ptr&lt;konto&gt; &gt; .</p>
<p>Mein Compiler (Borland Builder 2006) gibt aber jetzt den Fehler :<br />
&quot;[C++ Fehler] functional(134): E2093 'operator&lt;' ist im Typ 'auto_ptr&lt;konto&gt;' für Argumente desselben Typs nicht implementiert&quot;</p>
<p>Wenn ihr sonstige Anmerkungen zum Quelltext habt dann macht die <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="🙂"
    /> Kritik ist erwünscht will mich schließlich verbessern.</p>
<p>So hier der Code<br />
Unit1.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include &lt;iostream&gt;
#include &lt;set&gt;
#include &lt;conio.h&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;memory&gt;
#pragma hdrstop
using namespace std;
#include &quot;konto.h&quot;
//---------------------------------------------------------------------------
int mainmenu()
{
 int tmp;
 clrscr();
 gotoxy(20,8);
 cout&lt;&lt;&quot;1 Neues Konto anlegen&quot;;
 gotoxy(20,9);
 cout&lt;&lt;&quot;2 Buchungen&quot;;
 gotoxy(20,10);
 cout&lt;&lt;&quot;3 Konto loeschen&quot;;
 gotoxy(20,11);
 cout&lt;&lt;&quot;4 Kontoinformationen anzeigen&quot;;
 gotoxy(20,12);
 cout&lt;&lt;&quot;5 Programm beenden&quot;;
 gotoxy(35,16);
 cin&gt;&gt;tmp;
 return tmp;
}
void writeData(const set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
 ofstream out(&quot;konto.dat&quot;);
 set&lt;auto_ptr&lt;konto&gt; &gt;::const_iterator it = dat.begin();
 kDat tmp;
 while(it != dat.end())
 	{
        tmp=(*it)-&gt;retDat();
        out&lt;&lt;tmp.kArt&lt;&lt;endl;
        out&lt;&lt;tmp.kStand&lt;&lt;endl;
        out&lt;&lt;tmp.kNr&lt;&lt;endl;
        out&lt;&lt;tmp.kR&lt;&lt;endl;
    }

}

void CreateKonto(set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
  clrscr();
  string tmp;
  int kd;
  stringstream u;
  int tm;
  gotoxy(12,6);
  cout&lt;&lt;&quot;Geben Sie den gewünschten Kontotyp ein:&quot;;
  gotoxy(51,6);
  cin&gt;&gt;tmp;
  if(tmp == &quot;Girokonto&quot; || tmp == &quot;girokonto&quot;)
  	{
    gotoxy(12,7);
    cout&lt;&lt;&quot;Geben Sie den Uberziehungsrahmen ein&quot;;
    gotoxy(58,7);
    cin&gt;&gt;tm;
    tm*=-1;
    kd=dat.size()+1;
    u&lt;&lt;kd;
    u&gt;&gt;tmp;
    auto_ptr&lt;konto&gt; temp;
    temp.reset(new girokonto(tm,tmp));
    dat.insert(temp);

    }
  if(tmp == &quot;Sparkonto&quot; || tmp==&quot;sparkonto&quot;)
  	{
    gotoxy(12,7);
    cout&lt;&lt;&quot;Geben Sie die Mindesteinlage ein&quot;;
    gotoxy(58,7);
    cin&gt;&gt;tm;
    kd=dat.size()+1;
    u&lt;&lt;kd;
    u&gt;&gt;tmp;
    auto_ptr&lt;konto&gt; temp;
    temp.reset(new sparkonto(tm,tmp));
    dat.insert(temp);
    }
}
void Buchen(const set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{    
  string tmp;
  clrscr();
  cout&lt;&lt;&quot;Geben Sie die Kontonummer an&quot;;
  cin&gt;&gt;tmp;  
}
void Kontoloeschen(set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
  clrscr();
}
void LoadDat(set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
 vector&lt;string&gt; tmp;
 string t,art,nr;
 int stand,r;
 auto_ptr&lt;konto&gt; temp;
 stringstream u;
 ifstream in(&quot;konto.dat&quot;);
 while(!in.eof())
 	{
      in&gt;&gt;t;
      tmp.push_back(t);
    }
 vector&lt;string&gt;::iterator it = tmp.begin();
 for(unsigned int i=0;i&lt;tmp.size()/4;i++)
 	{
    art = *it;
    it++;
    nr=*it;
    it++;
    u&lt;&lt;*it;
    u&gt;&gt;stand;
    it++;
    u&lt;&lt;*it;
    u&gt;&gt;r;
    if(art==&quot;s&quot;)
    	{
        	temp.reset(new sparkonto(r,nr));
            temp-&gt;Buchung(stand);
            dat.insert(temp);
        }
    if(art==&quot;g&quot;)
    	{
            temp.reset(new girokonto(r,nr));
            temp-&gt;Buchung(stand);
            dat.insert(temp);
        }

    }
}
void ShowKonto(const set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{

}
#pragma argsused
int main(int argc, char* argv[])
{
set&lt;auto_ptr&lt;konto&gt; &gt; tmp;

while(1)
switch(mainmenu())
	{
    case 1:CreateKonto(tmp); break;
    case 2:Buchen(tmp);break;
    case 3:Kontoloeschen(tmp); break;
    case 4:ShowKonto(tmp); break;
    case 5:
    clrscr();
    writeData(tmp);
    cout&lt;&lt;&quot;Aenderungen wurden gespeichert&quot;&lt;&lt;endl;
    cout&lt;&lt;&quot;Press any Key to quit&quot;;
    getchar();
    getchar();
    return 0;
    }

}
</code></pre>
<p>konto.h</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef kontoH
#define kontoH
struct kDat
{
    string kArt;
    string kStand;
    string kNr;
    string kR;
};
class konto
{
  private:
  string kontoart;
  int kontostand; //in Cent
  string kontonr;
  protected:
  konto(const string&amp; kdnr,const string&amp; art);

  public:
  virtual ~konto(){}
  int getKontostand();
  virtual void Buchung(int Betrag)=0;
  virtual kDat retDat();
  long long int getKdnr();
};
class girokonto : public konto
{
  private:
  int ueberziehungsrahmen;
  public:
  void Buchung(int Betrag);
  girokonto(int Ueberziehungsrahmen,const string&amp; Kontonr);
  kDat retDat();

};
class sparkonto : public konto
{
  private:
  int mindestEinlage;
  public:
  void Buchung(int Betrag);
  sparkonto(int MindestEinlage,const string&amp; Kontonr);
  kDat retDat();
};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>konto.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include&lt;string&gt;
#include&lt;sstream&gt;
#pragma hdrstop
using namespace std;

#include &quot;konto.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
int konto::getKontostand()
{
  return kontostand;
}
void konto::Buchung(int Betrag)
{
 kontostand += Betrag;
}
void girokonto::Buchung(int Betrag)
{
  if(konto::getKontostand() + Betrag &lt; ueberziehungsrahmen)
  	{
        throw 1;
    }
  else konto::Buchung(Betrag);
}
void sparkonto::Buchung(int Betrag)
{
  if(konto::getKontostand() + Betrag &lt; mindestEinlage)
  	{
        throw 2;
    }
  else konto::Buchung(Betrag);
}
konto::konto(const string&amp; kdnr,const string&amp; art) : kontonr(kdnr),kontostand(0),kontoart(art){} 
girokonto::girokonto(int Ueberziehungsrahmen,const string&amp; Kontonr): konto(Kontonr,&quot;Girokonto&quot;),ueberziehungsrahmen(Ueberziehungsrahmen){}
sparkonto::sparkonto(int MindestEinlage,const string&amp; Kontonr) : konto(Kontonr,&quot;Sparkonto&quot;),mindestEinlage(MindestEinlage){}
kDat konto::retDat()
{
    kDat erg;
    stringstream u;
    u&lt;&lt;kontostand;
    u&gt;&gt;erg.kStand;
    erg.kNr=kontonr;
    return erg;
}

kDat sparkonto::retDat()
{
 stringstream u;
 kDat erg = konto::retDat();
 erg.kArt=&quot;s&quot;;
 u&lt;&lt;mindestEinlage;
 u&gt;&gt;erg.kR;
 return erg; 
}
kDat girokonto::retDat()
{
 stringstream u;
 kDat erg = konto::retDat();
 erg.kArt=&quot;g&quot;;
 u&lt;&lt;ueberziehungsrahmen;
 u&gt;&gt;erg.kR;
 return erg;
}
long long int konto::getKdnr()
{
    stringstream u;
    u&lt;&lt;kontonr;
    int erg;
    u&gt;&gt;erg;
    return erg;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/174835/problem-mit-std-list-und-auto_ptr</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 21:52:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174835.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Mar 2007 12:16:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 12:16:18 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>hab mein Programm das Ürsprünglich die Daten in eine std::list&lt;konto*&gt; gespeichert hat umgebaut zu std::set&lt;auto_ptr&lt;konto&gt; &gt; .</p>
<p>Mein Compiler (Borland Builder 2006) gibt aber jetzt den Fehler :<br />
&quot;[C++ Fehler] functional(134): E2093 'operator&lt;' ist im Typ 'auto_ptr&lt;konto&gt;' für Argumente desselben Typs nicht implementiert&quot;</p>
<p>Wenn ihr sonstige Anmerkungen zum Quelltext habt dann macht die <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="🙂"
    /> Kritik ist erwünscht will mich schließlich verbessern.</p>
<p>So hier der Code<br />
Unit1.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include &lt;iostream&gt;
#include &lt;set&gt;
#include &lt;conio.h&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;memory&gt;
#pragma hdrstop
using namespace std;
#include &quot;konto.h&quot;
//---------------------------------------------------------------------------
int mainmenu()
{
 int tmp;
 clrscr();
 gotoxy(20,8);
 cout&lt;&lt;&quot;1 Neues Konto anlegen&quot;;
 gotoxy(20,9);
 cout&lt;&lt;&quot;2 Buchungen&quot;;
 gotoxy(20,10);
 cout&lt;&lt;&quot;3 Konto loeschen&quot;;
 gotoxy(20,11);
 cout&lt;&lt;&quot;4 Kontoinformationen anzeigen&quot;;
 gotoxy(20,12);
 cout&lt;&lt;&quot;5 Programm beenden&quot;;
 gotoxy(35,16);
 cin&gt;&gt;tmp;
 return tmp;
}
void writeData(const set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
 ofstream out(&quot;konto.dat&quot;);
 set&lt;auto_ptr&lt;konto&gt; &gt;::const_iterator it = dat.begin();
 kDat tmp;
 while(it != dat.end())
 	{
        tmp=(*it)-&gt;retDat();
        out&lt;&lt;tmp.kArt&lt;&lt;endl;
        out&lt;&lt;tmp.kStand&lt;&lt;endl;
        out&lt;&lt;tmp.kNr&lt;&lt;endl;
        out&lt;&lt;tmp.kR&lt;&lt;endl;
    }

}

void CreateKonto(set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
  clrscr();
  string tmp;
  int kd;
  stringstream u;
  int tm;
  gotoxy(12,6);
  cout&lt;&lt;&quot;Geben Sie den gewünschten Kontotyp ein:&quot;;
  gotoxy(51,6);
  cin&gt;&gt;tmp;
  if(tmp == &quot;Girokonto&quot; || tmp == &quot;girokonto&quot;)
  	{
    gotoxy(12,7);
    cout&lt;&lt;&quot;Geben Sie den Uberziehungsrahmen ein&quot;;
    gotoxy(58,7);
    cin&gt;&gt;tm;
    tm*=-1;
    kd=dat.size()+1;
    u&lt;&lt;kd;
    u&gt;&gt;tmp;
    auto_ptr&lt;konto&gt; temp;
    temp.reset(new girokonto(tm,tmp));
    dat.insert(temp);

    }
  if(tmp == &quot;Sparkonto&quot; || tmp==&quot;sparkonto&quot;)
  	{
    gotoxy(12,7);
    cout&lt;&lt;&quot;Geben Sie die Mindesteinlage ein&quot;;
    gotoxy(58,7);
    cin&gt;&gt;tm;
    kd=dat.size()+1;
    u&lt;&lt;kd;
    u&gt;&gt;tmp;
    auto_ptr&lt;konto&gt; temp;
    temp.reset(new sparkonto(tm,tmp));
    dat.insert(temp);
    }
}
void Buchen(const set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{    
  string tmp;
  clrscr();
  cout&lt;&lt;&quot;Geben Sie die Kontonummer an&quot;;
  cin&gt;&gt;tmp;  
}
void Kontoloeschen(set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
  clrscr();
}
void LoadDat(set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{
 vector&lt;string&gt; tmp;
 string t,art,nr;
 int stand,r;
 auto_ptr&lt;konto&gt; temp;
 stringstream u;
 ifstream in(&quot;konto.dat&quot;);
 while(!in.eof())
 	{
      in&gt;&gt;t;
      tmp.push_back(t);
    }
 vector&lt;string&gt;::iterator it = tmp.begin();
 for(unsigned int i=0;i&lt;tmp.size()/4;i++)
 	{
    art = *it;
    it++;
    nr=*it;
    it++;
    u&lt;&lt;*it;
    u&gt;&gt;stand;
    it++;
    u&lt;&lt;*it;
    u&gt;&gt;r;
    if(art==&quot;s&quot;)
    	{
        	temp.reset(new sparkonto(r,nr));
            temp-&gt;Buchung(stand);
            dat.insert(temp);
        }
    if(art==&quot;g&quot;)
    	{
            temp.reset(new girokonto(r,nr));
            temp-&gt;Buchung(stand);
            dat.insert(temp);
        }

    }
}
void ShowKonto(const set&lt;auto_ptr&lt;konto&gt; &gt;&amp; dat)
{

}
#pragma argsused
int main(int argc, char* argv[])
{
set&lt;auto_ptr&lt;konto&gt; &gt; tmp;

while(1)
switch(mainmenu())
	{
    case 1:CreateKonto(tmp); break;
    case 2:Buchen(tmp);break;
    case 3:Kontoloeschen(tmp); break;
    case 4:ShowKonto(tmp); break;
    case 5:
    clrscr();
    writeData(tmp);
    cout&lt;&lt;&quot;Aenderungen wurden gespeichert&quot;&lt;&lt;endl;
    cout&lt;&lt;&quot;Press any Key to quit&quot;;
    getchar();
    getchar();
    return 0;
    }

}
</code></pre>
<p>konto.h</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef kontoH
#define kontoH
struct kDat
{
    string kArt;
    string kStand;
    string kNr;
    string kR;
};
class konto
{
  private:
  string kontoart;
  int kontostand; //in Cent
  string kontonr;
  protected:
  konto(const string&amp; kdnr,const string&amp; art);

  public:
  virtual ~konto(){}
  int getKontostand();
  virtual void Buchung(int Betrag)=0;
  virtual kDat retDat();
  long long int getKdnr();
};
class girokonto : public konto
{
  private:
  int ueberziehungsrahmen;
  public:
  void Buchung(int Betrag);
  girokonto(int Ueberziehungsrahmen,const string&amp; Kontonr);
  kDat retDat();

};
class sparkonto : public konto
{
  private:
  int mindestEinlage;
  public:
  void Buchung(int Betrag);
  sparkonto(int MindestEinlage,const string&amp; Kontonr);
  kDat retDat();
};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>konto.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include&lt;string&gt;
#include&lt;sstream&gt;
#pragma hdrstop
using namespace std;

#include &quot;konto.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
int konto::getKontostand()
{
  return kontostand;
}
void konto::Buchung(int Betrag)
{
 kontostand += Betrag;
}
void girokonto::Buchung(int Betrag)
{
  if(konto::getKontostand() + Betrag &lt; ueberziehungsrahmen)
  	{
        throw 1;
    }
  else konto::Buchung(Betrag);
}
void sparkonto::Buchung(int Betrag)
{
  if(konto::getKontostand() + Betrag &lt; mindestEinlage)
  	{
        throw 2;
    }
  else konto::Buchung(Betrag);
}
konto::konto(const string&amp; kdnr,const string&amp; art) : kontonr(kdnr),kontostand(0),kontoart(art){} 
girokonto::girokonto(int Ueberziehungsrahmen,const string&amp; Kontonr): konto(Kontonr,&quot;Girokonto&quot;),ueberziehungsrahmen(Ueberziehungsrahmen){}
sparkonto::sparkonto(int MindestEinlage,const string&amp; Kontonr) : konto(Kontonr,&quot;Sparkonto&quot;),mindestEinlage(MindestEinlage){}
kDat konto::retDat()
{
    kDat erg;
    stringstream u;
    u&lt;&lt;kontostand;
    u&gt;&gt;erg.kStand;
    erg.kNr=kontonr;
    return erg;
}

kDat sparkonto::retDat()
{
 stringstream u;
 kDat erg = konto::retDat();
 erg.kArt=&quot;s&quot;;
 u&lt;&lt;mindestEinlage;
 u&gt;&gt;erg.kR;
 return erg; 
}
kDat girokonto::retDat()
{
 stringstream u;
 kDat erg = konto::retDat();
 erg.kArt=&quot;g&quot;;
 u&lt;&lt;ueberziehungsrahmen;
 u&gt;&gt;erg.kR;
 return erg;
}
long long int konto::getKdnr()
{
    stringstream u;
    u&lt;&lt;kontonr;
    int erg;
    u&gt;&gt;erg;
    return erg;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1238892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238892</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 12:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 12:26:54 GMT]]></title><description><![CDATA[<p>Naja, std::list ist nicht sortierender container. std::set hingegen ja.<br />
Du kannst dein problem dadurch lösen, dass du den &lt;-Operator für std::auto_ptr überlädst, der z.b. die adressen vergleicht.<br />
also soetwas wie:</p>
<pre><code class="language-cpp">bool operator&lt;(std::auto_ptr&lt;konto&gt; a, std::auto_ptr&lt;konto&gt; b)
{ return a.get() &lt; b.get(); }
</code></pre>
<p>Dadurch (eigentlich schon vorher) baust du zwar eine konto-lösch-maschiene. aber das findest du spätestens wenn du das programm startest (hoffentlich) selbst heraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238902</guid><dc:creator><![CDATA[cppuser]]></dc:creator><pubDate>Sun, 04 Mar 2007 12:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 13:12:59 GMT]]></title><description><![CDATA[<p>ok dieses Problem wäre gelöst. vielen dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238931</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 13:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 13:29:17 GMT]]></title><description><![CDATA[<p>auto_ptr hat in Standardkontainern nichts verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238936</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 04 Mar 2007 13:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 13:59:08 GMT]]></title><description><![CDATA[<p>warum ? was wäre die alternative?</p>
<p>wenn ich einen normalen zeiger verwende wird glaub ich der dynamische Speicher nicht freigegeben wenn ein zeiger aus dem kontainer gelöscht wird. Oder täusche ich mich da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238960</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 13:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 14:12:02 GMT]]></title><description><![CDATA[<p>Zur Frage warum, habe ich dir schon einen hinweis gegeben.<br />
Beispiel:</p>
<pre><code class="language-cpp">struct A
{
   int a;
   A() : a(10) {}
};

void foo(std::auto_ptr&lt;A&gt; a)
{
}

int main()
{
   std::auto_ptr&lt;A&gt; var(new A);
   std::cout &lt;&lt; var-&gt;a &lt;&lt; std::endl;
   foo(var);
   std::cout &lt;&lt; var-&gt;a &lt;&lt; std::endl; /// hier 
   // und jedes mal, wenn du auf das Objekt zugreifst bekommst du ein Problem
   return 0;
}
</code></pre>
<p>Passenderes gibt es dafür in der Standard-lib von c++ nicht.<br />
Was du suchst sind smart pointer oder aber kannst du eine Funktion schreiben, die den Speicher selbst freigibt.</p>
<p>Außerdem vorher hast du std::list verwendet. warum bist du jetzt auf std::set umgestiegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238970</guid><dc:creator><![CDATA[cppuser]]></dc:creator><pubDate>Sun, 04 Mar 2007 14:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 14:21:10 GMT]]></title><description><![CDATA[<p>hmm ok dann wäre z.B. boost::scoped_ptr&lt;konto&gt; besser nehme ich an.</p>
<p>std::set verwende ich nur zur Übung weil ich damit noch nie etwas gemacht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238978</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 14:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 14:23:44 GMT]]></title><description><![CDATA[<p>walljumper schrieb:</p>
<blockquote>
<p>warum ?</p>
</blockquote>
<p>Weil auto_ptr nicht den Anforderungen, den Kontainer an ihre Elemente stellen, genügt. Für auto_ptr ist u.a.</p>
<pre><code class="language-cpp">auto_ptr&lt;foo&gt; t(new foo);
const auto_ptr&lt;foo&gt; u(new foo);
auto_ptr&lt;foo&gt; T(t); // ok, aber T und t nicht äquivalent
auto_ptr&lt;foo&gt; U(u); // error, konstanter auto_ptr nicht kopierbar
</code></pre>
<p>walljumper schrieb:</p>
<blockquote>
<p>wenn ich einen normalen zeiger verwende wird glaub ich der dynamische Speicher nicht freigegeben wenn ein zeiger aus dem kontainer gelöscht wird. Oder täusche ich mich da?</p>
</blockquote>
<p>Ein nackter Zeiger verhält sich in einem Kontainer nicht anders als sonst auch.</p>
<p>walljumper schrieb:</p>
<blockquote>
<p>was wäre die alternative?</p>
</blockquote>
<p>Reihenfolge ohne Belang:<br />
1. Benutz einen Kontainer, der explizit für Polymorphe Objekte gedacht ist [boost.ptr_container]<br />
2. Benutz einen Smartpointer, der shared ownership betreibt, z.B. boost::shared_ptr<br />
3. Benutz einen Smartpointer, der depp copy betreibt<br />
Für 1. und 3. muss deine Klasse clonebar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238980</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 04 Mar 2007 14:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 14:25:28 GMT]]></title><description><![CDATA[<p>walljumper schrieb:</p>
<blockquote>
<p>hmm ok dann wäre z.B. boost::scoped_ptr&lt;konto&gt; besser nehme ich an.</p>
</blockquote>
<p>ich kenne mich mit boost nicht aus, aber dem namen nach macht es dasselbe wie auto_ptr</p>
<p>ich persönlich verwende Loki <a href="http://loki-lib.sourceforge.net/" rel="nofollow">http://loki-lib.sourceforge.net/</a><br />
Dort heißt das Ding was du suchst. SmartPtr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238984</guid><dc:creator><![CDATA[cppuser]]></dc:creator><pubDate>Sun, 04 Mar 2007 14:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 14:40:20 GMT]]></title><description><![CDATA[<p>cppuser schrieb:</p>
<blockquote>
<p>walljumper schrieb:</p>
<blockquote>
<p>hmm ok dann wäre z.B. boost::scoped_ptr&lt;konto&gt; besser nehme ich an.</p>
</blockquote>
<p>ich kenne mich mit boost nicht aus, aber dem namen nach macht es dasselbe wie auto_ptr</p>
<p>ich persönlich verwende Loki <a href="http://loki-lib.sourceforge.net/" rel="nofollow">http://loki-lib.sourceforge.net/</a><br />
Dort heißt das Ding was du suchst. SmartPtr</p>
</blockquote>
<p>der Loki::SmartPtr ist nicht so einfach zu benutzen, wie die Smartpointer von boost. In diesem Fall ist der <a href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm" rel="nofollow">boost::shared_ptr&lt;&gt;</a> die erste Wahl. Denn dort heißt es</p>
<blockquote>
<p>Every shared_ptr meets the CopyConstructible and Assignable requirements of the C++ Standard Library, and so can be used in standard library containers.</p>
</blockquote>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239007</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 04 Mar 2007 14:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 14:41:25 GMT]]></title><description><![CDATA[<p>hmm das verwirrt mich jetzt etwas in der dokumentation von boost wird boost::scoped_ptr als smartpointer bezeichnet. naja</p>
<blockquote>
<p>2. Benutz einen Smartpointer, der shared ownership betreibt, z.B. boost::shared_ptr</p>
</blockquote>
<p>scheint das richtige zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239008</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 14:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:12:30 GMT]]></title><description><![CDATA[<p>kann es sein, dass du nicht verstanden hast warum auto_ptr bzw. scoped_ptr nicht geeignet sind?</p>
<p>wie gesagt scoped_ptr kenn ich nicht. ICh bin heute mal nett und erkläre auto_ptr</p>
<p>Im Groben und Ganzen funktioniert auto_ptr folgendermaßen:<br />
Diese Klasse sorgt dafür, dass der Zeiger, den sie kapselt, dann zerstört wird, wenn der Desturktor von auto_ptr aufgerufen wird.<br />
Der Desktuktor wird dann aufgerufen, wenn der Gültigkeitsbereich des auto_ptr-Objekts verlassen wird. Diese Technik wird RAII (Resource Acquisition Is Initialization).<br />
Wenn du beispielweise nun diese Funktion aufrufst:</p>
<pre><code class="language-cpp">void foo(std::auto_ptr&lt;int&gt; a)
{
// viel kode
// ..

// Dann ist hier der Gültigkeitsbereich von a zu 
// ende. a gibt selbst dann den Speicher den du vorher 
// angefordert hast frei. (Siehe unten)
}

int main()
{
   std::auto_ptr&lt;int&gt; abc(new int);
   *(abc.get()) = 10;

   foo(zeiger); // Die Speicherverwaltung wird von dem Parameter übernommen
   // Nach dem Aufruf, ist der Speicher freigegeben. abc zeigt nicht mehr 
   // auf einen gültigen Bereich.

   // Warum das so ist
   std::auto_ptr&lt;int&gt; bcd(new int);
   *(bcd.get()) = 10;
   std::auto_ptr&lt;int&gt; cde(bcd); /// Hier passiert nun folgendes:
   /*
      der Zeiger wird an cde übergeben.
      bcd verweist auf null.
   */
</code></pre>
<p>Eine vereinfachte implementierung von dem auto_ptr würde ungefähr so aussehen:</p>
<pre><code class="language-cpp">struct MyPtr
{
   explicit MyPtr(int* p)
      : zeiger_(p) { }

   MyPtr(const MyPtr z)
   {
      zeiger_ = z.zeiger_;
      z.zeiger_ = NULL;
   }

   int* get()
   { return zeiger_; } 
private:
   int* zeiger_; 
};
</code></pre>
<p>Hoffentlich war es verständlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239022</guid><dc:creator><![CDATA[cppuser]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:14:56 GMT]]></title><description><![CDATA[<p>Verdammt, habe bei MyPtr den Destruktor vergessen:</p>
<pre><code class="language-cpp">~MyPtr()
{
   delete zeiger_;  // Wenn der Zeiger NULL ist, wird nichts freigegeben.
}
</code></pre>
<p>PS: Und nochwas, denke nicht daran auto_ptr (oder MyPtr) im Zusammenhang mit Arrays zu verwenden. Arrays werden mit delete[] freigegen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239023</guid><dc:creator><![CDATA[cppuser]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:14:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:23:18 GMT]]></title><description><![CDATA[<p>Ja hab ich schon verstanden bin nur etwas durcheinander gekommen, weil du gemeint hast ich brauche einen smartpointer.<br />
In der Dokumentation von boost wird boost::scoped_ptr als smartpointer bezeichnet. Die anderen hier haben aber aber gesagt das auto_ptr nicht geht wegen Problemen beim kopieren diese hat der boost::scoped_ptr aber auch.</p>
<p>Jetzt frag ich mich nur was gilt den jetzt als smartpointer <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/1239026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239026</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:27:46 GMT]]></title><description><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Intelligenter_Zeiger" rel="nofollow">http://de.wikipedia.org/wiki/Intelligenter_Zeiger</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239028</guid><dc:creator><![CDATA[cppuser]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:31:59 GMT]]></title><description><![CDATA[<p>Eine ausführliche Erläuterung findet man bei <a href="http://www.gotw.ca/publications/using_auto_ptr_effectively.htm" rel="nofollow">Herb Sutter</a> (nach &quot;Container&quot; suchen).</p>
<p>Herb Sutter nennt auto_ptr&lt;&gt; in Containern in einem anderen Artikel auch &quot;nackt über das Minenfeld laufen&quot; - d.h. es kann gut gehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239029</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:31:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:49:17 GMT]]></title><description><![CDATA[<p>vielen dank für eure ausführliche hilfe <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/1239041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239041</guid><dc:creator><![CDATA[walljumper]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit std::list und auto_ptr on Sun, 04 Mar 2007 15:57:16 GMT]]></title><description><![CDATA[<p>scoped_ptr kannst du im Übrigen gar nicht in einen Container packen, weil dafür müsste er eine Kopiersemantik besitzen, was ein scoped_ptr nicht hat.</p>
<p>Wenn du eh boost verwendest nimm die pointer container von boost.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1239047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1239047</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sun, 04 Mar 2007 15:57:16 GMT</pubDate></item></channel></rss>