std::vector: Cannot instantiate abstract class
-
FreakY<3Cpp schrieb:
Tut es aber nicht, hab ich irgendwas vergessen?...
Dein Beispiel kompiliert erst gar nicht mit einem korrekt implementierten Singleton, weil du eben keinen neuen Instanzen erstellen kannst.
Der Zugriff geht so:std::cout << Singleton::get().Number
-
Bei mir kompiliert es ( Code::Blocks )
Aber okay, gut zu wissen. Man denkt wohl anders als C# Liebhaber :p
-
FreakY<3Cpp schrieb:
Bei mir kompiliert es ( Code::Blocks )
Nukularfüsiker schrieb:
Dein Beispiel kompiliert erst gar nicht mit einem korrekt implementierten Singleton
Jockelx schrieb:
Vielleicht solltest du das in deinem Beispiel nicht weglassen
private: SpriteManager( const SpriteManager & ) {} SpriteManager & operator=( const SpriteManager & );
-
FreakY<3Cpp schrieb:
Bei mir kompiliert es ( Code::Blocks )
der korrekte Code ist wie Jockelx angemerkt hat:
class Singleton { private: Singleton() { } Singleton( const Singleton & ); Singleton & operator=( const Singleton & ); public: static Singleton& get() { static Singleton s; return s; } int Number; }; int main() { Singleton s = Singleton::get(); s.Number = 5; Singleton s2 = Singleton::get(); std::cout << s2.Number; }
Aber okay, gut zu wissen. Man denkt wohl anders als C# Liebhaber :p
naja, in c# hast du halt klassen konstruktoren, die erleichtern die arbeit natürlich.
-
Ersma Danke für die vielen Antworten
Ja, mir ist klar was eine abstrakte Klasse ist. Ich habe sie extra abstrakt gemacht.
Ich weiss nur von Java her, dasss ich so etwas schreiben könnte:
List<Sprite> sprites;
Da dachte ich, dass dies auch in C++ der Fall ist. Klar ist mir, dass ich anschliessend natürlich nur Referenzen der Unterklassen im vector speichern kann. Aber ich dachte durch die Polymorphie wäre dies möglich.
Ich verstehe nun leider immer noch nicht wie ich das konkret machen kann, dass ich nachher in dem vector alle Referenzen auf Objekte der Unterklassen von Sprite darin speichern kann. Welchen Typ muss ich da angeben? Oder bin ich mal wieder auf dem Holzweg weil ich mühe habe von Java nach C++ umzudenken? ^^
-
icarus2 schrieb:
Ich verstehe nun leider immer noch nicht wie ich das konkret machen kann, dass ich nachher in dem vector alle Referenzen auf Objekte der Unterklassen von Sprite darin speichern kann. Welchen Typ muss ich da angeben? Oder bin ich mal wieder auf dem Holzweg weil ich mühe habe von Java nach C++ umzudenken? ^^
In Java hat man ja nur Zeiger.
Foo f=new Foo();
in C++ hat man aber einen Unterschied zwischen Zeiger und dem Objekt selber.
Foo f; Foo* p=new Foo();
Deshalb muss man auch bei Containern Zeiger angeben (wie man es in Java ja auch macht):
vector<Foo*> vec;
Da jedes new auch ein delete erfordert ist es, falls der vector die Elemente selber besitzt, sinnvoll boost::ptr_vector zu verwenden...
-
Ui mist, das hatte ich ja ganz vergessen. Vielen Dank für den Hinweis.
Ich sollte mir boost mal wirklich etwas genauer ansehen. Ich hatte bisher leider noch keine Zeit.
Danke dir
-
Bei mir ist gerade noch eine Frage bezüglich der Singletons aufgetaucht.
Wenn ich eine Membervariable mit new erzeuge, so bräuchte ich ja einen Destructor, in dem das Objekt mit delete gelöscht wird. Ich habe mir dann zuerst gedacht, dass ich wirklich einen Destructor dafür nehmen muss. Doch dann fiel mir auf, dass ein Singleton sowiso während der ganzen Laufzeit des Programms existiert. Also brauch ich dafür gar keinen Destructor und es wäre dann vielleicht auch sinnvoller dieses Objekt gar nicht mit new zu erzeugen. Liege ich da richtig?
-
icarus2 schrieb:
Wenn ich eine Membervariable mit new erzeuge, so bräuchte ich ja einen Destructor, in dem das Objekt mit delete gelöscht wird. Ich habe mir dann zuerst gedacht, dass ich wirklich einen Destructor dafür nehmen muss. Doch dann fiel mir auf, dass ein Singleton sowiso während der ganzen Laufzeit des Programms existiert. Also brauch ich dafür gar keinen Destructor und es wäre dann vielleicht auch sinnvoller dieses Objekt gar nicht mit new zu erzeugen. Liege ich da richtig?
Wenn du etwas mit new anlegst, musst du es auch irgendwann mit delete loeschen.
Deshalb sind singletons ein recht komplexes Thema - da das anlegen und zerstoeren nicht ganz trivial ist.
Der von dir verwendete Meyers Singleton ist solange du nur nicht von mehreren threads aus auf ihn zugreifst ziemlich gut. also lass ihn fuers erste so wie er ist
Leider ist es schwer gute Resourcen zu dem Thema zu finden. Wenn du mehr wissen willst mach aber am besten einen neuen Thread auf - denn der wird sicher ziemlich lang werden...
-
Wegen dem new/delete hat jemand mal eine interessante Idee geäussert. Bei einem Singleton wäre es ja nicht so tragisch mal die Ressource nicht freizugeben, weil das ja höchstens einmal passiert. Man hat da dann allerdings garantierte Lebenszeit des Objektes. Sollte nicht unbedingt gemacht werden, wenn es gemieden werden kann, kann allerdings durchaus einen Verwendungszweck haben.
Aber so als grundsätzliches Singleton ist das von Meyers bestimmt eine gute Idee.
-
Alles klar, danke für die Info.
Multithreading habe ich in C++ noch nie ausprobiert. Ist ja soweit ich gehört habe nicht gerade ein triviales Thema.
Ich lass dann mal mein Singleton so wie es ist.
Thx für die Antworten.
-
drakon schrieb:
Wegen dem new/delete hat jemand mal eine interessante Idee geäussert. Bei einem Singleton wäre es ja nicht so tragisch mal die Ressource nicht freizugeben, weil das ja höchstens einmal passiert.
Das mag vielleicht auf Speicher und andere Ressourcen zutreffen, für die das Betriebssystem sorgt. Ansonsten wäre ich eher vorsichtig...
Andrei Alexandrescu hat in Modern C++ Design auch einige Ansätze zur Zerstörung von Singletons vorgestellt.
-
Nexus schrieb:
Modern C++ Design
Ist das auch so eine Lektüre wie z.B. "Effective C++", die man gelesen haben sollte?
-
icarus2 schrieb:
Nexus schrieb:
Modern C++ Design
Ist das auch so eine Lektüre wie z.B. "Effective C++", die man gelesen haben sollte?
Jap, definitiv.
-
icarus2 schrieb:
Ist das auch so eine Lektüre wie z.B. "Effective C++", die man gelesen haben sollte?
Jein. Es ist mehr ein Ideen Buch. Effective C++ muss man gelesen haben, Modern C++ Design nicht unbedingt. Es ist interessante und zeigt neue Perspektiven auf, aber effektiv deinen Code verbessern tut es nicht.
Interessant ist es auf jedenfall - aber ein must-read ist es nicht.
-
Aso, oki. Thx für die Info.
-
Es ist vor allem sehr interessant, um den kreativen Einsatz und die Macht von templates sehen möchte. Bringt einem vor allem eine komplett andere Sichtweise von templates, wie sie üblicherweise genutzt werden.
-
Ich behalts mal im Hinterkopf. Da ich nächstens die Matura mache habe ich atm leider nicht so viel Zeit. Aber über die langen Sommerferien werd ichs vielleicht mal lesen.
-
Shade Of Mine schrieb:
Effective C++ muss man gelesen haben
Muss man? Ich bin bis heute nicht dazugekommen. Aber wenn ich solche Punkte (nicht die Kommentare dazu) lese, hab ich nicht das Gefühl, da würde wahnsinnig viel Neues für mich drin stehen. Aber der Eindruck kann natürlich auch täuschen. Vielleicht hätte ich das Buch früher lesen sollen...
drakon schrieb:
Es ist vor allem sehr interessant, um den kreativen Einsatz und die Macht von templates sehen möchte. Bringt einem vor allem eine komplett andere Sichtweise von templates, wie sie üblicherweise genutzt werden.
Genau. Wenn man an die Grenzen der Programmiersprachen gehen und relativ unbekannte Ansätze kennenlernen möchte, ist das Buch auf jeden Fall eine Empfehlung wert. Ich bin sehr begeistert davon gewesen.
-
Nexus schrieb:
Muss man?
Man kann natuerlich auch von Leuten lernen die Effective C++ gelesen haben - das kommt fast aufs selbe raus
PS:
was ich damit meine ist, dass man hier als langjaehriger Leser sicher fast dasselbe lernt wie wenn man die Buecher alle selber gelesen haette.Gerade so leute wie camper oder pumuckl und wie sie alle heissen liefern ja ein wahnsinns geballtes wissen hier ab.