Problem mit Übersetzungseinheit und Klasse
-
Ich arbeite jetzt zum ersten mal mit übersetzungseinheiten und bin hier auf ein kleines Problem gestoßen das ich mir leider nicht erklären kann.
Es geht um folgendes, ich habe 2 Klassen egschrieben, ein der Klassen ist einfach nur ein Container in den ich mehrere static Funktionen und dazugehörige Hilfsfunktionen gestopft habe, die 2. Klasse ist eine "richtige" Klasse. Beide Klassen funktionieren einwandfrei, lassen sich jedoch aus übersetzungseinheiten heraus weder ersteleln noch Aufrufen.
Hier Quelltext für die richtige Klasse (gekürzt auf die vom Linker angegebenen Problemstellen)
Das hier steht im Header
class Arena { public: Arena(); ~Arena(); void start(); };in der dazugehörigen cpp steht folgendes
class Arena { public: Arena() { //Anweisungen etc }; ~Arena() { //Anweisungen etc }; void start() { //Anweisungen etc }; };in meiner main.cpp ist der entsprechende Header included wenn ich aber
Arena aren; aren.start();nutze bekomme ich eine Meldung über 3 unresolved externals die sich auf den Konstructor, Deconstructor und die Methode start beziehen, wenn ich die Klasse komplett nach main kopiere funktioniert alles Tadellos.
Bei meinem Funktionscontainer ist das Problem ähnlcih, steht er komplett in einem header gibt es keine Probleme, ändere ich den header um so das dort die Klasse nur definiert ist und kopiere den Quelletxt in eine cpp um bekomem ich bei class::function aufrufen ebenfalls fehlermeldungen, die mit nur header nicht auftreten.
Was mache ich also Falsch? Ich hab mir verschiedene Texte zu Übersetzungseinheiten angesehen und kannd en fehler leider nicht finden.
-
Arena::Arena() { //Anweisungen etc }; Arena::~Arena() { //Anweisungen etc }; void Arena::start() { //Anweisungen etc };Du darfst die Klasse nur einmal deklarieren. In der .cpp kommen die Definitionen rein, die wie o.a aussehen.
Dann solltest du auch gerade mal Header Guards anschauen.#ifndef ARENA_H #define ARENA_H class Arena { public: Arena(); ~Arena(); void start(); }; #endif //ARENA_H
-
Danke für den Tip, dh wenn ich die alte Übersicht erhalten will bleibt mir im Grunde nichts anderes übrig als den rest der Klasse auszukomemntieren wenn ich ihn der übersichthalber in der cpp haben will?
-
Xebov schrieb:
Danke für den Tip, dh wenn ich die alte Übersicht erhalten will bleibt mir im Grunde nichts anderes übrig als den rest der Klasse auszukomemntieren wenn ich ihn der übersichthalber in der cpp haben will?
Ja, aber als persönlicher Tipp, mach das nicht, das hilft der Übersicht nicht. Man kann mit Kommentaren da etwas besser helfen, z.b:
////////////////////////////////////////////////////////// // Header : Header file #ifndef _H_HEADER_GUARD__ #define _H_HEADER_GUARD__ ////////////////////////////////////////////////////////// // MyClass class MyClass { // Attributes // private: int m_myInt; // Constructors & Destructor // public: MyClass(int myInt = 0); ~MyClass(); // Methods // public: void do_something() const; bool is_five() const { return m_myInt == 5; }; int do_it(); }; #endif////////////////////////////////////////////////////////// // Header : Implementation file #include "Header.hpp" #include <iostream> ////////////////////////////////////////////////////////// // MyClass /********************************************************/ /* Constructors & Destructor */ /********************************************************/ MyClass::MyClass(int myInt /* = 0*/) : m_myInt(myInt) { } /********************************************************/ MyClass::~MyClass() { } /********************************************************/ /* Methods */ /********************************************************/ void MyClass::do_something() { std::cout << "start! do! done!" << std::endl; } /********************************************************/ int MyClass::do_it() { /* A lot of code */ return m_myInt; }Das sind so Möglichkeiten, wie man die Cpp "verschönern" kann. Ist natürlich auch Geschmacksache.
Grüssli
-
Hi,
Xebov schrieb:
...die alte Übersicht erhalten ... übersichthalber in der cpp haben will?
Das ist in C++ absolut unüblich - und ich glaub auch unpraktisch. Mag sein, dass z.B. jemandem, der von Java her kommt, das vielleicht gewohnter vorkommt, aber das dürfte höchstens noch während einer kurze Gewöhnunngsphase gelten.
Auf Dauer wird der Ärger durch "Doppelpflegen" (und den unvermeidlichen Fehlern dabei) viel stärker ins Gewicht fallen.... dann würde ich eher zu "inline-Definitionen" (wie man sie aus Java kennt und wie sie auch in C++ erlaubt sind) im Header raten.
Gruß,
Simon2.
-
Ich hab da mal noch ein paar kleine verständnissfragen, die habe ich mir gerade zusammengesucht und will nur sichergehen das ich das richtig verstanden habe.
Wenn ich Funktionen oder Methoden habe die static sind muß das static nur beid er deffinition im Header drinstehen aber nicht in der cpp?
Wenn ich eienr Funktion oder Methode deffault Argumente gebe dürfen diese auch nur im header vorkommen aber nicht in der cpp?EDIT:
Ich bin noch auf ein anderes problem gestoßen, ich habe jetzt alels richtig deffiniert und in die CPPs versenkt, allerdings funktioniert das noch nicht und ich weis leide rnicht warum.
Folgendes Problem: ich habe 2 Klassen beide sind in eienr header Datei deffiniert, und beide header sind in beiden zugehörigen cpps included. das problem besteht jetzt darin das er ind en headern meckert wenn dort zeiger auf die jeweilig andere Klasse vorkommen.
//in bot.h Arena *pt //in arena.h Bot *pt;Meine Frage ist nun wieso meckert er dort, die header sind ja in den cpps ordentlich includiert.
Nach einigem Nachlesenw eis ich jetzt auch das die eine Klasse der anderen zwar dank Header in der cpp bekannt ist nur eben im header nicht, aber wie kann ich beide Klassen in getrenten ehadern halten und sie trotzdem miteinander verbinden?