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
|
Verfasst am: 07.12.2004, 14:32 Titel: operator+ |
|
|
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.
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 07.12.2004, 16:13 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.12.2004, 16:28 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 07.12.2004, 16:36 Titel: |
|
|
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  _________________ 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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.12.2004, 16:40 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 07.12.2004, 16:52 Titel: |
|
|
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  _________________ 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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.12.2004, 17:23 Titel: |
|
|
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 |
|
 |
C++Builder Senior JLI'ler

Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 07.12.2004, 17:31 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 07.12.2004, 17:36 Titel: |
|
|
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 |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 07.12.2004, 19:03 Titel: |
|
|
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...  |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.12.2004, 21:46 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.12.2004, 21:57 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.12.2004, 22:06 Titel: |
|
|
ok, Patrick hat mich aufgeklärt. InlineFunktionen und methode müssen IMMER in der .h stehen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 08.12.2004, 14:12 Titel: |
|
|
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...
Mein Bsp. sollte das noch verdeutlichen...  |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

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