Nicht deklarierter Bezeichner



  • Diese Zeile verursacht folgende Fehlermeldungen:

    std::vector < std::shared_ptr<Ball> > schweif;
    
    Fehler	C2065	"Ball": nichtdeklarierter Bezeichner	
    
    Fehler	C2923	"std::shared_ptr": "Ball" ist kein gültiges template-Typargument für den _Ty-Parameter.
    
    Fehler	C3203	"shared_ptr" : Klasse template (nicht spezialisiert) kann nicht als template-Argument für den template-Parameter "_Ty" verwendet werden, ein realer Typ wurde erwartet.
    

    Woran kann das liegen?
    Btw: die Klasse Ball erbt von einer anderen Klasse


  • Mod

    numbo schrieb:

    Woran kann das liegen?

    Vermutlich ist "Ball" in diesem Kontext ein nicht deklarierter Bezeichner.

    Ich rate mal wild ins Blaue und sage: Fehler bei Benutzung von Headerdateien.



  • EDIT:
    Fehler gefunden(Ein #include Befehl musste raus).Danke für den Tipp 😉



  • Die Frage ist: muss es shared_ptr sein?



  • Es würden warscheinlich auch unique_ptr gehen.

    Gibt es bei shared_ptr Performance-Einbußen im Vergleich zu unique_ptr?



  • Naja es muss ein Referenzzähler alloziiert werden und der muss bei jedem copy erhöht werden. shared_prt ist aber auch semantisch falsch, schließlich willst du den Besitz eines Balls nicht teilen.



  • Hab das ganze nun auf unique_ptr geändert. Funktioniert einwandfrei



  • roflo schrieb:

    ... schließlich willst du den Besitz eines Balls nicht teilen.

    Ich kann jetzt zwar aus den dürftigen Informationen nicht herleiten, dass dem tatsächlich so ist, aber falls ja, dann stimmt das natürlich, was du sagst.
    Man kann sogar noch einen Schritt weiter gehen und sich zunächst einmal fragen, ob hier überhaupt Besitzverhältnisse im Spiel sind, d.h. ob die Bälle nicht eigentlich einer anderen Datenstruktur zugeordnet sind (ihr "gehören") die den Vektor in jedem Fall überlebt. In diesem Fall darf man auch gerne nackte Pointer verwenden - daran ist nichts verwerflich und es ist sogar zu bevorzugen solange die Datenstruktur/Funktion oder sonstwas, welche die Pointer vorhält, nicht dafür verantwortlich ist, diese irgendwann zu löschen.

    Gruss,
    Finnegan



  • In meinem Fall sind Smart-Pointer bequemer, da ziemlich viele Objekte erzeugt werden und auch wieder gelöscht werden müssen.Daher fällt diese Arbeit für mich weg.



  • numbo schrieb:

    Hab das ganze nun auf unique_ptr geändert. Funktioniert einwandfrei

    Dann ist der Vector also der einzige Besitzer der Objekte? Wenn man nicht mit polymorphen Objekten arbeitet würde auch ein ein

    std::vector<Ball> schweif;
    

    völlig ausreichen.



  • std::vector<Ball> schweif;
    

    Das würde bedeuten, dass die Ball-Objekte erst beim Programende gelöscht werden,oder?



  • Nein. Sie werden dann gelöscht, wenn sie aus dem Vector entfernt werden, oder der Vector gelöscht wird.


Anmelden zum Antworten