Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
template <typename T> class Container { protected: inline void setMaximumSize(uint32 uiMaxSize) { m_uiMaxSize = uiMaxSize; } public: Container() : m_uiMaxSize(1000000) // set maximum size to 1 million; User certainly has to go, that there is enough memory. {} virtual void clear() { m_Items.clear(); } const std::vector<std::shared_ptr<T>>& getItems() const { return m_Items; } virtual void setItem(uint32 ID, std::shared_ptr<T> &item) { if (ID) { try { if (--ID >= getSize()) resize(ID+1); m_Items.at(ID) = item; } catch (const std::length_error&) {} } } bool getItem(uint32 ID, std::shared_ptr<const T> &result) const { if (hasValidItem(ID)) { result = m_Items.at(ID-1); return true; } return false; } bool getItem(uint32 ID, std::shared_ptr<T> &result) { std::shared_ptr<const T> temp; if (const_cast<const GapsContainer<T>&>(*this).getItem(ID, temp)) { result = std::const_pointer_cast<T>(temp); return true; } return false; } inline bool hasValidItem(uint32 ID) const { return ID && --ID < getSize() && ID < getMaximumSize() && m_Items.at(ID); } inline uint32 getSize() const { return m_Items.size(); } inline uint32 getMaximumSize() const { return std::min(m_uiMaxSize, m_Items.max_size()); } virtual void resize(uint32 size) { if (size <= getMaximumSize()) m_Items.resize(size); else throw std::length_error("The requested size is greater than the maximum."); } private: uint32 m_uiMaxSize; protected: std::vector<std::shared_ptr<T>> m_Items; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class Prototype { public: Prototype(uint32 ID) : m_ID(ID) {} inline void setName(const QString &sName) { m_sName = sName; } inline QString getName() const { return m_sName; } inline uint32 getID() const { return m_ID; } inline void setID(uint32 ID) { m_ID = ID; } private: uint32 m_ID; QString m_sName; }; class WorldObjectPrototype : public Prototype { public: WorldObjectPrototype(uint32 ID = 0) : Prototype(ID), m_uiMovementSpeed(32) {} inline void setMovementSpeed(uint16 uiSpeed) { m_uiMovementSpeed = uiSpeed; } inline uint16 getMovementSpeed() const { return m_uiMovementSpeed; } private: uint16 m_uiMovementSpeed; }; |
C-/C++-Quelltext |
|
1 |
typedef Container<WorldObjectPrototype> WorldObjectPrototypeContainer; |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (04.09.2013, 13:31)
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
"[Es ist nicht möglich], eine komplexe QT GUI als Template zu nutzen, [...]": vielleicht liegt es daran, dass ich mit den Templates in C++ bisher nie gearbeitet habe und meine Erfahrungen damit daher äußerst begrenzt sind, allerdings weiß ich nicht, was du damit ausdrücken willst. Du kannst aus einer komplexen GUI (also mehrere Objekte, die einander referenzieren) kein Template machen? (Das ist wohl eher weniger gemeint, da die Mechanismen der Templates sich, soweit ich weiß, auf Typen beziehen.)
Ich weiß nicht, an welcher Stelle unser Verständnis auseinander geht. Vermutlich liegt es wohl daran, dass bei dir diese "Prototypen" nicht als Vorlage für irgendetwas dienen und dann ohne Ende dupliziert/kopiert werden, sondern nur zur Speicherung der Daten dienen, die dann ausschließlich von anderen Klassen verarbeitet werden (bspw. eine für die Logik, wie Bewegung, und eine für Darstellung). Wenn das der Fall ist, solltest du dein Prototype und WorldObjectPrototype in AbstractModel/ModelBase/IModel und WorldObjectModel o. ä. umbenennen. Und du solltest dir Gedanken machen, ob es einen Grund für die Aufteilung gibt.
Warum verwendest du für jeden Typ (also für alle Objekte einer einzelnen Klasse) eine eigene Instanz deines Containers? Warum kannst du nicht einen einzigen (bspw. Container<Prototype>/Container<ModelBase>) verwenden?
Was den Zweck angeht:
Du hast ein Problem, weshalb du hier um Rat gefragt hast. Dieses Problem entsteht, weil du versuchst, eine Lösung für die eigentliche "Aufgabe"/"Anforderung"/... umzusetzen, dies aber so (noch) nicht funktioniert. Ich würde jetzt gerne eine Beschreibung der Aufgabe haben, bei deren Lösung du das Problem hast. Dazu sollte es nicht notwendig sein, auf irgendeine Programmiersprache einzugehen. Das könnte dann wie folgt aussehen: "Mein Charakter soll sich in seiner Umgebung bewegen, die tile-basiert ist und Objekte beinhaltet, die eine beliebige Größe haben und sich unabhängig vom Raster bewegen können.", "Wenn auf diesen Button geklickt wird, soll sich das nächste Menü von rechts nach links ins Bild schieben, während das vorherige sich zur linken Seite heraus schiebt", "Der Benutzer soll über die Oberfläche seine Objekttypen definieren können. Diese sollen in einer Hirarchie stehen, wobei die definierten Variablen an darunterliegende Typen weitergereicht werden können. Im Leveleditor des Tools soll er diese Typen nur noch in das Level ziehen müssen und kann dann deren Werte bestimmen. ..." usw.
Auch wenn ich nicht weiß, wie genau die Anforderungen lauten, würde ich einfach mal wild etwas in den Raum werfen:
Du könntest dir eine einzige Klasse schreiben, die die benötigten Variablen verwalten kann. Der muss lediglich mitgeteilt werden, was die Namen dieser sind und welche Typen diese haben, damit diese dann in einem assoziativen Array verwaltet werden können. Für die Definition, welche Variablen mit welchen Typen vorhanden sind, könnte es eine weitere Klasse geben.
Das Problem dabei ist allerdings, dass das Handling ziemlich unschön werden könnte, selbst wenn man das Speichern und Laden dieser Daten ersteinmal außen vor lässt.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (05.09.2013, 09:34)
Werbeanzeige