Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Abstrakte klassen als template parameter für std container

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.07.2007, 17:53 Uhr
DiscordianDude



Hallo,

gibt es eine möglichkeit oder einen trick mit dem man abstrakte klassen als template parameter für eine der std container angeben kann.
Die frage kann man auch anders stellen:
Ich such einen container in den ich beliebige abgeleitete klassen einer abstrakten superklasse hinterlegen kann.
Gibt es sowas in der std lib? Hat jemand eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.07.2007, 20:27 Uhr
mike
Pinguinhüpfer
(Operator)


Hmm. Meinst du sowas alla

C++:
#include <iostream>
#include <vector>

class Basic
{
  public:
    virtual ~Basic() { };
    virtual void SagWas() const = 0;
};

class SpecialBasic : public Basic
{
  public:
    virtual ~SpecialBasic() { };
    virtual void SagWas() const { std::cout << "SpecialBasic" << std::endl; };
};

class SpecialBasic2 : public Basic
{
  public:
    virtual ~SpecialBasic2() { };
    virtual void SagWas() const { std::cout << "SpecialBasic2" << std::endl; };
};

int main (int argc, char * const argv[]) {
  std::vector<Basic *> vec;
  
  vec.push_back( new SpecialBasic );
  vec.push_back( new SpecialBasic2 );
  
  std::vector<Basic *>::const_iterator it;
  
  for(it = vec.begin(); it != vec.end(); ++it)
    (*it)->SagWas();
    
  return 0;
}


--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.07.2007, 21:13 Uhr
~DiscordianDude
Gast


Vielen Dank,

ich hab vorher versucht das ganze als <KLasse> anstatt <Klasse *> template zu machen. Dabei ruft vector natürlich den standart construktor von Klasse auf und verwendet dann den zuweisungsoperator um den objekt status zu kopieren. Kann ja nicht gehen bei einer abstrakten klasse.
Arbeite jetzt mit boost::ptr_vector

Noch eine andere frage: Beim obigen sourcecode, wer übernimmt da die speicherbereinigung die vector klasse?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.07.2007, 21:26 Uhr
~DiscordianDude
Gast


Beantworte meine frage mal schnell selber:

wenn man std::vector pointer verwalten lässt nimmt er nicht deren ownership an. D.H er erzeugt eine kopie des pointers und löscht diese wenn er gelöscht wird, also sein destruktor aufgerufen wird. => das eigentliche objekt bleibt noch im speicher zurück und es muss per hand gelöscht werden.
der boost::ptr_vector nimmt die bürden des besitzes gerne auf sich und löscht das ding dann am ende auch.

beste grüsse,

flo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.07.2007, 22:02 Uhr
0xdeadbeef
Gott
(Operator)


Das geht generell nicht, weil die Standardcontainer eine Kopie halten. Dann wird dir ein Objekt der Basisklasse aus einem Objekt der Unterklasse erstellt, und du verlierst alle zusätzlichen Daten der Unterklasse.

Übrigens erzeugt mikes Code ein Speicherloch, weil die auf dem Heap angelegten Objekte nicht wieder freigegeben werden - da muss noch ein

C++:
for(it = vec.begin(); it != vec.end(); ++it) delete *it;


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.07.2007, 11:39 Uhr
mike
Pinguinhüpfer
(Operator)


@0xdeadbeef: Najooo Da der Programmfluss eh simple ist kann man das auch dem OS überlassen *g* (99% der aktuellen OS sollten es selber löschen)
Sonst geb ich dir recht - boost::shared_ptr würde da auch besser herpassen
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: