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

11

21.04.2011, 20:50

Genau das war meine Frage ;D In diesem Fall können die Operatoren ja Memberfunktionen sein, da man wohl eh nur Vektoren mit Vektoren bearbeitet. Das einzige, was dann nicht mehr geht, ist z.B. "5.0f * vector".


Aber ich hatte jetzt doch noch ein sehr merkwürdiges Compilerproblem: Die Operatoren sind bei mir momentan noch global. Im Header sieht's so aus:

C-/C++-Quelltext

1
2
3
4
    inline Vector3 operator +(const Vector3&, const Vector3&);
    inline Vector3 operator -(const Vector3&, const Vector3&);
    inline Vector3 operator -(const Vector3&);
    [...]

Und in der CPP-Datei sind diese definiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    inline Vector3 operator +(const Vector3& a, const Vector3& b)
    {
        return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
    }
    inline Vector3 operator -(const Vector3& a, const Vector3& b)
    {
        return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
    }
    inline Vector3 operator -(const Vector3& v)
    {
        return Vector3(-v.x, -v.y, -v.z);
    }
    [...]


Nun erhalte ich beim Compilieren diese Fehlermeldungen:

(Link)

Da stimmt nun plötzlich etwas in der Matrixklasse nicht mehr. Hier eine betroffene Stelle mal (zu Fehler Nummer 1): Ganz normale Operatoraufrufe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Matrix Matrix::Camera(const Vector3& position, const Vector3& target, const Vector3& up)
    {
        // Z-Achse berechnen
        Vector3 z((position - target).Normalize());

        // X- und Y-Achse werden durch das Kreuzprodukt berechnet
        Vector3 x(Vector3::Cross(up, z).Normalize());
        Vector3 y(Vector3::Cross(z, x).Normalize());

        // Rotationsmatrix erzeugen, Translationsmatrix damit multiplizieren
        return Matrix::Translation(-position) * Matrix( // <------ ganz offensichtlich gibt es hier ein Problem!
            x.x,  y.x,  z.x, 0.0f,
            x.y,  y.y,  z.y, 0.0f,
            x.z,  y.z,  z.z, 0.0f,
            0.0f, 0.0f, 0.0f, 1.0f);
    }


Das Problem hatte ich zuvor dadurch gelöst, indem ich die Operatoren direkt in der Headerdatei definiere und nicht erst in der CPP-Datei. Aber wieso? Ich kann diese Linkerfehler nicht nachvollziehen. Wieso stimmen die beiden Funktionsköpfe angeblich nicht überein (habe sie ja oben zur Ansicht mal gepostet)?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Pac-Man« (21.04.2011, 21:03)


12

23.04.2011, 13:15

Hallo zusammen,

ich weiß garnicht ob es aufgefallen ist, im Nachhinein habe ich noch eine Frage zu den Operatoren hineineditiert ;)

13

23.04.2011, 14:22

Hm, da scheint irgendwas mit dem drumherum nicht ganz zu stimmen.
Ich hatte auch schon fiese Probleme mit Linkerfehlern, wo man sich fragt, wie das denn überhaupt sein kann, und dann sucht man stundenlang und dann war es irgendein kleines Detail (möglicherweise noch ganz woanders).
Lieber dumm fragen, als dumm bleiben!

jokester

Treue Seele

Beiträge: 125

Wohnort: Mainz

  • Private Nachricht senden

14

23.04.2011, 14:31

Wenn du ne Funktion mit nem inline versiehst muss die Definition auch in jeder Übersetzungseinheit verfügbar sein in der sie gebraucht wird. Also hau das inline da weg oder pack die Definition in den Header.
"There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened" -- Douglas Adams.

15

23.04.2011, 15:13

Ja, Tatsache, daran lag es. Inline ist nun weg.
Jaja, wenn die Erfahrung fehlt... und in diesem Fall auch mein Wissen^^

Besten Dank!

16

05.05.2011, 13:53

Übrigens was die objektorientiertheit der Tribase Engine angeht: Ich hab sie mir zwar noch nicht komplett angeschaut, aber so weit ich es gesehen habe ist sie überhaupt nicht objektorientiert angelegt. Hier hat sich der Author offensichtlich eher an C als an C++ orientiert, und nur ein bisschen syntactic sugar (Operatoren, Konstruktoren, etc) drübergestreut. "Die Objektorientierung verbessern" wäre daher nicht der richtige Ansatz, wenn man die Tribase Engine objektorientiert haben wollte müsste man das komplette Ding nochmal komplett neu schreiben.

Warum das so ist weiß ich auch nicht, entweder mag der Author C lieber oder wollte näher an der Windows/DirectX API dranbleiben (welche ja auch C ist).

Werbeanzeige