Du bist nicht angemeldet.

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

Darklink2000

Frischling

  • »Darklink2000« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Hamburg

Beruf: Software Developer

  • Private Nachricht senden

1

23.03.2013, 20:13

Vector<ClassName*> Problem

Hi Leute,

ich hab neuerdings wieder angefangen mal mit C++ an nem kleinem Test Projekt zu Arbeiten mit der SFML da ich mit derartigen Bibiotheken nie wirklich intensiv gearbeitet habe.

Ich bin derzeit aber auf ein Problem gestoßen was ich mal genauer erläutern will vorher...

Ich habe eine Klasse "Collider"

Die enthält unter anderen 3 std::vector attribute. (incommingCollisions, collisions & outgiongCollisions)
Diese container sollen aber wirklich auf jeden fall nur Zeiger auf Objekte enthalten und keine wirklichen instanzen von Collider Objekten.

Nun ist mir beim schreiben einer "bool isNewCollision(Collider* collider)" methode aufgefallen das ich da mit iteratoren deutlich wenig anfangen kann oder ich hab grad nen blackout^^

Gedachte Benutzung der Methode:

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
bool Collider::checkCollision(Collider* collider)
{
    if (!enabled)
    {
        // Collision detection deactivated for this Collider
        return false;
    }
    OnCheckCollision(collider);
    if (collisionDetected)
    {
        if (isNewCollision(collider))
        {
            OnCollisionEnter(collider);
        }   
         OnCollisionStay(collider); 
         return true;
    }
    if (wasCollision(collider))
    {
        OnCollisionExit(collider);
    }
    return false;
}


Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
bool Collider::isNewCollision(Collider* collider)
{
    std::vector<Collider*>::iterator it;
    for (it = incommingCollisions.begin(); it != incommingCollisions.end(); it++)
    {
        if ( it-> ) // <---- Hier kann ich ja jetzt nicht auf das Objekt zugreifen :-/  
        {
            return true;
        }
    }
    return false;
}


Ich hatte sonst gedacht vieleicht so mit std::vector<Collider*>::reference ref = incommingCollisions.front() ...
Nur da weiß ich leider nicht ob ich da einfach ohne bedenken ref++ machen kann zb in einer for schleife.

Kann mir jemand mal beim DenkBooting helfen...
Würd mich freuden

mfg Darklink2000
Compiler Error: X( ---> :| ---> :) (Yayyy wieder was dazu gelernt)
"Fehler sind das beste was dir passieren kann!"

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Darklink2000« (23.03.2013, 20:35) aus folgendem Grund: Formatierung...


Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

2

23.03.2013, 20:49

(*it)->...
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Darklink2000

Frischling

  • »Darklink2000« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Hamburg

Beruf: Software Developer

  • Private Nachricht senden

3

23.03.2013, 20:55

Ich will aber eigentlich wirklich die Adressen vergleichen^^ Und nicht nach werten.
Außer ich geb den Collidern noch collider Ids und frag die dann ab aber das wollte ich mir eigentlich schenken.

Weil zumindest Visual Studio zeigt mir keine möglichen befehle dann an das hatte ich naehmlich schon versucht.


Edit:
:dash:

Ok geht... Mann ich hasse dieses Klammern um einzelne sachen...
Danke.

Ich hatte naehmlich
*it->
und
&(*it)

versucht und da hat VS nix angezeigt.

Was ist der unterschied zwischen
(*it) und *it in diesem falle?

Macht er bei zweiterem sozusagen einen . operator aufruf auf dem Zeiger wenn ich -> beim iterator verwende und darum gehts nicht?
Und beim ersten dann? Durch die klammer erstmal nur den zeiger und hängt dann daran den -> operator an?
Compiler Error: X( ---> :| ---> :) (Yayyy wieder was dazu gelernt)
"Fehler sind das beste was dir passieren kann!"

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Darklink2000« (23.03.2013, 21:24)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

23.03.2013, 21:57

Ich will aber eigentlich wirklich die Adressen vergleichen^^
Dann mach das doch, der Iterator ist doch genau von dem Typ Adresse eines Colliders.

5

23.03.2013, 21:57

http://de.wikibooks.org/wiki/C++-Program…_Priorit%C3%A4t

Je Weiter Unten, desto später werden sie ausgeführt. Das sollte eigentlich sämtliche Fragen beantworten.

Aber:

Zitat

Diese container sollen aber wirklich auf jeden fall nur Zeiger auf Objekte enthalten und keine wirklichen instanzen von Collider Objekten.

Warum? Ein Zeiger ist ersteinmal nur ein Werkzeug von vielen, welche Designentscheidung möchtest du damit umsetzen? Denn möglicherweise willst du in Wirklichkeit einen vector<unique_ptr<Collider>>, falls der vector die Collider-Objekte verwaltet.
Und wo wir gerade dabei sind: Sagt am besten auch gleich noch, warum du Adressen vergleichen möchtest.
Lieber dumm fragen, als dumm bleiben!

Darklink2000

Frischling

  • »Darklink2000« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Hamburg

Beruf: Software Developer

  • Private Nachricht senden

6

23.03.2013, 22:26

Weil die Collider bei mir in der GameObject Klasse als attribut sind und die collider wissen mit welchen collider objekten sie collidieren. Nur wenn ich das ohne Zeiger mache, dann wird in den collider listen ja auf das falsche objekt geprüft wegen den kopierten objekten dann.

Das Design ist der Zeit so:

Ich hab nen GameController der vectors von Controllable Objekten hat.
Von diesen Controllables ruft der GameController solange das Controllable nicht deaktiviert ist die OnUpdate Methode auf.
Und alle Objekte im Spiel die halt sich updaten sollen... (zb Timer und GameObjects usw) implementieren die Controllable Methoden.

Dann hab ich halt derzeit zb die Basisklasse für alle Grafischen Objekte im spiel (GameObject)
Jetzt wollte ich anfangen (weil hatte ich noch nie gemacht^^) mal ne simple Kollisions erkennung zu bauen.

Mein GameObject hat als Attribut die Collider, die Collider wiederum kennen das GameObject um zb Trigger realisieren zu können.
Also es wird von der Basisklasse Collider checkCollisionsAufgerufen. Die handhabt erstmal grundlegende abfragen wies weiter geht und falls es weiter geht werden überschriebene methoden aufgerufen von der klasse die von Collider erbt (z.B RectCollider) Die berechnen dann die eigentliche collision und fügen collider mit den sie collidieren in die vectors auf und setzen den collisions status.
Die Collider basisklasse übernimmt zum schluss dann die verarbeitung der collisionen und ruft dann von den GameObject zu dem es gehört eine Collisions action auf.
(hab ich mir so gedacht halt zb wenn man machen will das eine Wand sich aufschiebt wenn man in eine gewisse nähe kommt oder so)

Und da wäre es denke ich mal falsch wenn ich da keine Zeiger verwende oder nich?

Zitat

Ich will aber eigentlich wirklich die Adressen vergleichen^^
Ja... Is mir nach abschicken auch aufgefallen das ich schwachsinn geschrieben habe^^
Compiler Error: X( ---> :| ---> :) (Yayyy wieder was dazu gelernt)
"Fehler sind das beste was dir passieren kann!"

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

7

23.03.2013, 22:54

Jo, schoen. Dann mach das doch so.

Darklink2000

Frischling

  • »Darklink2000« ist der Autor dieses Themas

Beiträge: 10

Wohnort: Hamburg

Beruf: Software Developer

  • Private Nachricht senden

8

23.03.2013, 23:33

Ok diese antwort bekomm ich nicht wirklich interpretiert...
(Ironie oder nich?)
Compiler Error: X( ---> :| ---> :) (Yayyy wieder was dazu gelernt)
"Fehler sind das beste was dir passieren kann!"

9

24.03.2013, 08:45

Die Umsetzung hört sich soweit ganz ordentlich an.

Ich habe den Punkt nur deshalb angesprochen, weil es dank C++11 so hübsche neue Möglichkeiten gibt. Das Grundproblem ist eben, dass man oft eine dynamische Anzahl an Objekten hat, und es irgendeinen Verantwortlichen geben muss, der diese wieder löscht. Möchte man jetzt mehrere Objekte in einem Vektor verwalten, kann man sie natürlich die Klasse als Template-Argument benutzen, muss dann aber davon ausgehen, das Objekte innerhalb des Vektors kopiert werden (bzw. sei C++11 gemoved werden, falls die Klasse das unterstützt). Das ist unter Umständen teuer und hat noch das nette Problem, dass Zeiger auf Objekte in dem Vector ungültig werden können, wenn man neue Objekte einfügt und löscht.
Also möchte man vielleicht lieber Zeiger speichern. Dann braucht man aber im Destruktor eine Schleife, die alle Objekte in dem Vector deleted, bevor dieser Zerstört wird. Und man muss aufpassen, was passiert, wenn man den Vector einen neuen Wert zuweist, oder Objekte löscht - es gibt eine Menge Stellen wo Objekte gelöscht werden müssen, und man übersieht schnell eine.
Deshalb möchte man vielleicht statt Zeigern Smart-Pointer benutzen. Das Problem ist, dass der alte auto_ptr sich nicht für Container eignet, weil es passieren kann und wird, dass Objekte einfach zwischendurch mal gelöscht werden. Soetwas wie shared_ptr funktionieren zwar wieder in Containern, sind aber nicht ganz billig und eigentlich eine übertriebene Notlösung.
Aaaaber, seit C++11 gibt es ja den tollen, neuen unique_ptr, der alles besser macht und sich wunderbar als Containerinhalt eignet.
Und Errungenschaften wie eben jener unique_ptr sind auch der Grund, weshalb man spätestens jetzt in einem C++ Programm ganz ohne delete auskommt (mit Ausnahme einiger Hilfsklassen vielleicht) und trotzdem nie Memory-Leaks hat.
Lieber dumm fragen, als dumm bleiben!

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

10

24.03.2013, 09:45

Ok diese antwort bekomm ich nicht wirklich interpretiert...
(Ironie oder nich?)
War jetzt keine so komplizierte Antwort, oder? Ist dt. nicht deine Muttersprache?

Werbeanzeige