JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f3aba057498d39d39390db46c098481eMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

operator+

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 14:32    Titel: operator+ Antworten mit Zitat

also ich verscuhe meiner Klasse Operatoren hinzuzufügen:

--------------------Konfiguration: MathTest - Win32 Debug--------------------
Linker-Vorgang läuft...
quellcode.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: class cVector __thiscall cVector::operator+(class cVector const &)" (??HcVector@@QAE?AV0@ABV0@@Z)
Debug/MathTest.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Code:

   ShowVector(v1+v2);

Die Zeile macht ärger. (Hauptprogramm)

Code:

__forceinline cVector cVector::operator+ (const cVector &V)
{
   return cVector(x+V.x, y+V.y, z+V.z, w);
}

Die Funktion in der Global.cpp

Code:

class cVector
{
...
   __forceinline cVector operator+ (const cVector &V);
...
};

Die Funktion ist ein member der cVectorklasse.

Alos wie gesagt, ich hab eigneltich alles ausprobiert, so genau stand das eigentlich auch im cpp Buch, aber es geht halt net.

[Edit]Achja, das geile ist, das es in der Global.cpp Funktiniert, wenn ich den Operator aufruge. Aus dem Fehler schließe ich ja auch, der der weiß, das er die Funktion hat, sie aber nrigendwo finden kann. Obwohl ich oben drüber #include "Global.h" geschrieben habe.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 16:13    Titel: Antworten mit Zitat

Hmm...komisch.
Normalerweise bedeutet der Fehler ja, dass du irgendwo einen vergessenen Funktionsprototypen ohne Rumpf hast...
In welcher Datei steht denn der Rumpf? Geht es vielleicht, wenn du den Rumpf direkt in die Klassendefinition schreibst?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 16:28    Titel: Antworten mit Zitat

wie cool, jetzt geht es! Danke! Allersings ist es schon ein bisschen schade, das ich dann jetzt wohl alle Operatoren in die KLasse schreiben muss und nicht in ne extra datei. aber naja, solange es funktioniert und schnell ist, gehts ja noch.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 16:36    Titel: Antworten mit Zitat

gut =)

Ich schreib meine Operatoren sowieso immer in die Klassen selbst, weil das meistens nur Ein- bis Zweizeiler sind. Deshalb war ich mir relativ sicher, dass es so gehen müsste Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 16:40    Titel: Antworten mit Zitat

verflixt, jetzt machen die Funktionen Streß!:
Also ich habe eine Funktion,

__forceinline cMatrix MatrixTranslation(float x, float y, float z);

in der Global.h und den entsprechnden Rumpf mit Kopf in der Global.cpp. Beide erste Zeilen stimmen bis auf das abschließende Semikolon genau überein.
Ich binde die Global.h ind die Quellcode.cpp ein und will da die FUnktion aufrufen. Und das geht nicht! Kommt wieder genau der gleiche Fehler!
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 16:52    Titel: Antworten mit Zitat

Kann es sein, dass du diese Global.h vielleicht in mehrere Dateien einbindest? Hast du #pragma once als "Doppeleinbindungsschutz" verwendet?
Dann dürfte es zumindest Probleme machen, weil dann Global.h wirklich nur einmal eingebunden wird.
Ich weiß aber nicht, wie es bei #ifdef/#define aussieht Neutral
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 17:23    Titel: Antworten mit Zitat

ich hab das mit den ifndef/def gemacht.
Aber wenn ich das nicht mache, würde der ja meckern, das ich zweimal die selbe Klasse erstellt habe. Ich muss die ja in die Global.cpp und in die quellcode.cpp einbinden und später bestimmt noch in viel mehr Dateien
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 17:31    Titel: Antworten mit Zitat

Code:

#ifndef _FOO_H_
#define _FOO_H_
...
#endif


dürfte dasselbe wie #pragma once sein, nur das #pragma once AFAIK M$ spezifisch ist.

ifndef steht halt für IF Not DEFined

wenn das dann der Fall ist wird es definiert und darum wirds nur einmal ausgeführt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 17:36    Titel: Antworten mit Zitat

Hi,

Du wolltest ja gestern im ICQ genau wissen, wieso Operator + über Operator += implementiert werden sollte und wieso umbedingt Außerhalb der Klasse.

Hier paar Infos:
http://www.gotw.ca/gotw/004.htm

Kurz:
Wenn du op+ als member überlädst, dann ist der 1. Parameter immer implizit this und der 2. kann anhand von Konstruktoren entsprechen gecastet werden. Wenn op nicht als member überladen wird, dann können beide Parameter gegebenfalls gecastet werden.
Dazu ein kleines Beispiel:
Code:
    // __forceinline gibt es nur auf MS-Compilern
#if !defined (_MSC_VER) // Microsoft Compiler nicht vorhanden?
#define __forceinline inline
#endif

class Integer
{
public:
    Integer (void) : value_(0) { }
    Integer (int value) : value_(value) {}
    __forceinline int getValue (void) const { return (value_); }

    __forceinline const Integer operator+ (const Integer& rhs)
    { return Integer(value_ + rhs.value_); }
private:
    int value_;
};

int main (void)
{
    Integer i1 = 2;

    Integer result;
    result = i1 + 4;  // klappt, weil: i1.operator+(4)  , 4 kann per Ctor in Integer konvertiert werden
    result = 4 + i1;  // klappt nicht. 4.operator+ kann nicht gehen. operator+(4, i1) würde gehen!
   
    return 0;
}


Achja und zur Frage von Gestern wieso man C'tor und D'tor niemals inlinen sollte poste ich später noch was.

- Patrick
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 19:03    Titel: Antworten mit Zitat

Hab grad nur kurz Zeit, hab darum den Thread nur überflogen...
Für mich sieht das so aus, als wenn du folgendes gemacht hast:

Code:
//cBlabla.h

class Blabla {
inline void funktion();
};


Code:
//cBlabla.cpp

#include cBlabla.h

void Blabla::funktion(){...}


Das geht afaik so nicht, inline-Funktionen/Operatoren müssen afaik (!!) immer mit in die Header geschrieben werden....

entweder:
Code:
//cBlabla.h

class Blabla {
inline void funktion(){
...}
};


wobei das explizite inline eigentlich überflüssig sein dürfte, weil solche Funktionen generell "geinlined" werden, oder:
Code:
//cBlabla.h

class Blabla {
inline void funktion()
};

inline void Blabla::funktion(){...}



Wie gesagt, alles ohne Gewähr, hab auch grad absolut keine Zeit... Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 21:46    Titel: Antworten mit Zitat

nein, auch wenne s eine Mamber ist und komplett in der Klasse steht, funktioneirt inline nicht, kommt immer der selbe Linkerfehler, unaufgelößter externen Verweis
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 21:57    Titel: Antworten mit Zitat

also ich hab das jetzt echt noch mal extra ausprobiert:

main.cpp
Code:

#include "class.h"


void main()
{
   Zeigen();
}


class.cpp
Code:

#include "class.h"

inline void Zeigen()
{
   printf("hallo");
}


class.h
Code:

#ifndef _class_
#define _class_

#include <stdio.h>

inline void Zeigen();

#endif


Fehler:
Code:

--------------------Konfiguration: inlinetest - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
Linker-Vorgang läuft...
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl Zeigen(void)" (?Zeigen@@YAXXZ)
Debug/inlinetest.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

inlinetest.exe - 2 Fehler, 0 Warnung(en)


Ich hab auch extra alles durchgecheckt, Debug ging nciht, Release ging nicht, dann bei Release mit inline vor dem Prototypen probiert, vor der FUnktion probiert und ganz weggelassen. Nur ganz weggelassen ging, aber dann wars halt auch nciht mehr inline.
Bin ich denn zu blöd, eine inline Funktion in eine Datei zu packen?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 22:06    Titel: Antworten mit Zitat

ok, Patrick hat mich aufgeklärt. InlineFunktionen und methode müssen IMMER in der .h stehen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 08.12.2004, 14:12    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
ok, Patrick hat mich aufgeklärt. InlineFunktionen und methode müssen IMMER in der .h stehen.


Na lol:
GreveN hat Folgendes geschrieben:
Das geht afaik so nicht, inline-Funktionen/Operatoren müssen afaik (!!) immer mit in die Header geschrieben werden....


Genau das meinte ich damit... Wink
Mein Bsp. sollte das noch verdeutlichen... Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.12.2004, 14:17    Titel: Antworten mit Zitat

Embarassed
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum