Welche Endung zum Einbinden benutzen?
-
Ich habe zwei Dateien, eine "class.h" und eine "class.cpp", in denen die Klassedefinition und -deklaration ist, die ich für mein Program verwende.
Welche davon muss ich in main.cpp einbinden? Also wie muss das ausehen:
#include <iostream> include "class.h" //hier bekomme ich fehler vom linker, dass der viele //funktionen nicht auflösen kann (ich habe nicht vergessen, in //class.cpp "include "class.h"" zu schreiben). //include "class.cpp" //funktioniert, aber man bindet doch keine cpp ein, oder? int main(void) { return 0; }
-
natürlich den Header. Dann musst du noch lernen, wie du mit deinem Compiler die Klassen-Implementierung linkst
btw. mit der Endung hat das ziemlich wenig zu tun, in den Header kommt einfach die Deklaration und die Definition in die Code Datei. Egal, wie du die nennst.
Für C++-Header solltest du lieber .hpp anstelle von .h als Endung nehmen.
-
#include "class.h"
ist richtig.
[edit]
zu langsam
-
kingruedi schrieb:
Für C++-Header solltest du lieber .hpp anstelle von .h als Endung nehmen.
Hab mir's überlegt. Für C++-Header solltest du doch lieber .h anstelle von .hpp als Endung nehmen.
-
weiss nicht was schrieb:
include "class.h" //hier bekomme ich fehler vom linker, dass der viele
//funktionen nicht auflösen kann (ich habe nicht vergessen, in
//class.cpp "include "class.h"" zu schreiben).ist das zufällig ne template-klasse?
-
Ja!
-
kingruedi schrieb:
Dann musst du noch lernen, wie du mit deinem Compiler die Klassen-Implementierung linkst
Wäre echt nett von dir, wenn du mir auch noch sagen könntest, wie man das macht.
-
weiss nicht was schrieb:
kingruedi schrieb:
Dann musst du noch lernen, wie du mit deinem Compiler die Klassen-Implementierung linkst
Wäre echt nett von dir, wenn du mir auch noch sagen könntest, wie man das macht.
Wäre auch nicht schlecht wenn du mal sagen würdest welchen Compiler du hast?
Aber bei template Klassen sollte alles im Header sein auch die Defintionen der Funktionen.
-
Templates müssen leider im Header nicht nur deklariert sondern auch definiert werden. Also weg mit der *.cpp und alles in die .h-Datei schreiben.
Es gibt zwar laut Standard eine Methode (Keyword export) um trotzdem Templates in cpp-Files implementieren zu können die unterstützt aber derzeit kein Compiler richtig (bzw. überhaupt).
MfG SideWinder
-
Irgendwer schrieb:
weiss nicht was schrieb:
kingruedi schrieb:
Dann musst du noch lernen, wie du mit deinem Compiler die Klassen-Implementierung linkst
Wäre echt nett von dir, wenn du mir auch noch sagen könntest, wie man das macht.
WärFunktionene auch nicht schlecht wenn du mal sagen würdest welchen Compiler du hast?
MSVC++.
Aber das liegt jetzt nicht an den Templates (hab sie weg gemacht). Problem besteht immer noch.
Also die Aussage
Dann musst du noch lernen, wie du mit deinem Compiler die Klassen-Implementierung linkst
weist mich auf den Fehler hin, bringt mich aber nicht weiter.
-
Mir macht das Betteln echt keinen Spaß, aber es funktioniert troz verschiedener Experimente immer noch nicht.
-
Also ich kenn mich mit dem MSVC++ nicht aus, aber eigentlich linkt der ja alles vernünftig zusammen, ohne das du dich drum kümmern musst. Mach mal ein neues Projekt und probier folgendes aus
//foo.hpp class foo { int i; public: foo(int j) : i(j) { } int get() const { return i; } void do_something(); }; //foo.cpp #include "foo.hpp" void foo::do_something() { i+=100; } //main.cpp #include "foo.hpp" #include <iostream> int main() { foo bar(10); std::cout << bar.get() << '\n'; bar.do_something(); std::cout << bar.get() << '\n'; return 0; //<-- braucht der MSVC++ glaube ich }
Wenn der Code nicht geht, dann zeig mal ein minimal Beispiel von deinem Code.
volkard schrieb:
kingruedi schrieb:
Für C++-Header solltest du lieber .hpp anstelle von .h als Endung nehmen.
Hab mir's überlegt. Für C++-Header solltest du doch lieber .h anstelle von .hpp als Endung nehmen.
Nein, dass ist nicht gut, da so mein Editor durcheinander kommt und das für C hält. Außerdem sieht man so direkt, dass man es mit C++ Code zu tun hat, wenn man zB. fremden Code sieht und dann die Header Endungen betrachtet. Wenn schon .h dann nimm doch bitte auch .c und nicht .cpp :p
-
SideWinder schrieb:
Es gibt zwar laut Standard eine Methode (Keyword export) um trotzdem Templates in cpp-Files implementieren zu können die unterstützt aber derzeit kein Compiler richtig (bzw. überhaupt).
Der Comeau Compiler kann das angeblich und für den GCC soll es auch mal so experimente gegeben haben. Aber selbst die C++ Standard Leute haben eingesehen, dass export eine Schnaps Idee war.
-
weiss nicht was schrieb:
Mir macht das Betteln echt keinen Spaß, aber es funktioniert troz verschiedener Experimente immer noch nicht.
dann rück doch einfach code raus. reduziere as programm auf was kleines, das den selben fehler hat, das du posten kannst und das sich einer hier ohne mühe mal in seinen compiler stopfen kann.
dann kriegste auch sofort konkrete antwort.
aber das in-der-luft-rumstochern macht den leuten hier auch nicht so viel spaß, wie einfach mal schnell nen fehler wegzumachen. aber wir können nicht, weil die infos fewhlern und nach deinen beschreibungen der fehler nicht nachvollziehbar ist.
-
OK. Ich habe eine Liste geschreiben. HeadNode, InternalNode, TailNode und LinkedList-Klassendefinitionen in der "List.h", die Funktionsimplementierungen in der "List.cpp".
In meine Hauptfunktion binde ich "List.h" ein, was aber den folgenden Linkerfehler ergibt:
--------------------Konfiguration: Test - Win32 Release--------------------
Kompilierung läuft...
ID.cpp
List.cpp
main.cpp
Object.cpp
Linker-Vorgang läuft...
Bibliothek Release/Test.lib und Objekt Release/Test.exp wird erstellt
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall LinkedList<class Message>::LinkedList<class Message>(void)" (??0?$LinkedList@VMessage@@@@QAE@XZ)
Release/Test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.Test.exe - 2 Fehler, 0 Warnung(en)
Die Hauptfunktion sieht so aus:
#include <windows.h> //#define DEBUG #include "List.h" //Wenn ich List.cpp einbinde, gibt es keine Probleme! #include "../Root/test_object.h" //Message-Klasse, hier befinden sich Definition und Implementierung in einer einzigen Header-File //(wenn es anders waere, wuerde es vielleicht auch Probleme bereiten) //Message an sich ist aber nur zum Testen da und ist im Rumpf so gut wie leer. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc, LPSTR lpCmdLine, int nShowCmd) { LinkedList<Message>* list=new LinkedList<Message>;//erzeugt den Linkerfehler return 0; }
Die Implementierung des Konstruktors der LinkedList befindet sich wie gewöhnlich in der List.cpp.
Ist zwar unwichtig, aber die LinkedList-Klasse sieht so aus:
template<class T> class LinkedList { public: LinkedList(); LinkedList(const LinkedList<T>& rhs); LinkedList<T>& operator=(const LinkedList<T>& rhs); ~LinkedList(); //... private: HeadNode<T>* m_head; //... };
Kannst du das Problem vielleicht erkennen?
-
weis nicht was schrieb:
Die Implementierung des Konstruktors der LinkedList befindet sich wie gewöhnlich in der List.cpp.
Willst du uns hier verar...? Wurde doch schon mehrfach gesagt, dass du alles im Header definieren musst.
-
weis nicht was schrieb:
Kannst du das Problem vielleicht erkennen?
ja.
http://www.volkard.de/vcppkold/templatefunktionen.html
templatefunktionen aus anderen übersetungseinheiten können nicht verwendet werden. deshalb haben templatefunktionen dir lusteige eigenschaft, daß man ihre implementierung auch in den header schreiben soll. dafür schreibt man dann nix in die *.cpp.
und das gilt auch für jede methode einer templateklasse.
schreib also alles von der liste zurück in die *.h, dann sollte es laufen.