Hallo,
ich bin gerade dabei, mich etwas in C++ unter Linux (Ubuntu) einzuarbeiten. Als Editor benutze ich Geany. Testweise habe ich folgenden Code geschrieben:
main.cpp:
#include
#include "testclass.h"
using namespace std;
int main(void)
{
TestClass tc;
tc.main();
return 0;
}
testclass.h:
#ifndef \_testclass\_h\_
#define \_testclass\_h\_
class TestClass
{
public:
TestClass();
~TestClass();
int main();
};
#endif
testclass.cpp:
#include
#include "testclass.h"
using namespace std;
TestClass::TestClass()
{
cout
So weit, so gut. Wenn ich das ganze Kompiliere, bekomme ich Fehlermeldungen "undefined reference to `TestClass::TestClass()'" und "undefined reference to `TestClass::main()'". Es scheint so, als würden sich die cpp-Dateien gegenseitig nicht kennen. Binde ich die testclass.cpp per include in die main.cpp oder die testclass.h ein, funktioniert alles. Wobei letzteres ziemlich sinnlos ist, weil sich die zwei Dateien dann gegenseitig einbinden...
Kann es sein, dass es gar nicht an mir (oder an dem von mir erstellten Code) liegt, sondern an Geany? Ich habe über Projekt-\>Neu ein Projekt erstellt. Die Dateien werden ordnungsgemäß alle in der Registerkarte "Dokumente" aufgelistet.
Vllt. könnt ihr mir ja helfen...
Vielen Dank schonmal im Voraus für die Antworten.
Hi,
also, ich bekomme in deinem Beispiel nur die Fehlermeldung, dass TstClass nicht declared ist (zu recht, derweil du dich bei TestClass::main verschrieben hast).
Gruss
norsemanna
Stimmt *schäm*. Trotzdem bleibt der Fehler derselbe.
Hi,
Stimmt *schäm*. Trotzdem bleibt der Fehler derselbe.
du bekommst also bei
g++ main.cpp TestClass.cpp
immer noch einen Fehler?
Gruss
norsemanna
Werde ich so bald wie möglich mal probieren, komme wahrscheinlich heute nicht mehr unter Linux rein. Ich überlasse das Kompilieren und Erstellen eigentlich Geany. Kann es sein, dass die Dateien nicht zusammen in dem Projekt erkannt werden? Sie liegen alle im selben Ordner, ich habe bisher keinen Menüpunkt „Datei zum Projekt hinzufügen“ oder so ähnlich gefunden.
Hallo
Ich überlasse das Kompilieren und Erstellen eigentlich Geany.
Ist eher von abzuraten.
Kann es sein, dass die Dateien nicht zusammen in dem Projekt
erkannt werden? Sie liegen alle im selben Ordner, ich habe
bisher keinen Menüpunkt „Datei zum Projekt hinzufügen“ oder so
ähnlich gefunden.
Eben. Geany ist „etwas rudimentär“. Wenn Du wirklich eine
gute IDE suchst, die unter Windows und Linux zu verwenden
ist, dann nimmt Netbeans.
Allerdings erst, wenn Du das „Prinzip“ verstanden hast,
wie man händisch aus Einzelteilen ein lauffähiges Programm
zusammenbastelst. Im nächsten Schritt schreibst Du dann
ein Makefile, welches diesen Prozess übernimmt. *Und dann*
könntest Du auf den Luxus einer IDE zurückgreifen 
Grüße
CMБ
Danke für den Tipp. Ich habe mir jetzt Netbeans und das C/C+±Addon runtergladen und komme eigentlich gut zurecht. Eine Sache die mir gar nicht gefällt: Netbeans setzt die geschweiften Klammern so:
int main() {
}
Was für mich grässlich aussieht. Ich hätte sie lieber so:
int main()
{
}
Wie kann ich das ändern?
Ebenso nervig ist, dass Netbeans nach der öffnenden geschweiften Klammer gleich die schließende schreibt, was bei mir immer zu doppelten schließenden Klammern führt…
Hallo
Eine Sache die mir gar nicht gefällt: Netbeans setzt die
geschweiften Klammern so:
int main() {
}
Was für mich grässlich aussieht. Ich hätte sie lieber so:
int main()
{
}
Wie kann ich das ändern?
Tools / Options / Editor / Formatting /
[Language] ==> „C“
[Style] => K&R
[OK]
Ebenso nervig ist, dass Netbeans nach der öffnenden
geschweiften Klammer gleich die schließende schreibt, was bei
mir immer zu doppelten schließenden Klammern führt…
Tools / Options / Editor / Code Completion /
[Language] ==> „All Languages“
[] Insert closing brackets automatically
[OK]
Grüße
CMБ
Danke. hat mir sehr geholfen! Nur „Code Completion“ konnte ich nicht finden!?
Noch eine kleine Frage: Kann man irgendwo einstellen, dass in neuen Header-Files statt
#ifndef _MAIN_H
#define _MAIN_H
…
das hier steht:
#ifndef _MAIN_H_
#define _MAIN_H_
…
?
Hallo
Nur „Code Completion“ konnte ich nicht finden!?
Netbeans 6.7.1 ?
Noch eine kleine Frage: Kann man irgendwo einstellen, dass in
neuen Header-Files statt
#ifndef _MAIN_H
#define _MAIN_H
…
das hier steht:
#ifndef _MAIN_H_
#define _MAIN_H_
Weiss ich nicht. Was stört Dich am default?
Grüße
CMБ
Netbeans 6.5. Wie krieg ich die aktuelle? Installiert hab ich Netbeans über „Anwendungen installieren und Entfernen“. Bei der Aktualisierungsverwaltung kommt nix, dass es einen neuere gäbe.
Ich war nur bisher _MAIN_H_ gewohnt, deshalb.
Hallo
Netbeans 6.5. Wie krieg ich die aktuelle? Installiert hab ich
Netbeans über „Anwendungen installieren und Entfernen“. Bei
der Aktualisierungsverwaltung kommt nix, dass es einen neuere
gäbe.
Ubuntu halt, siehe => http://www.mail-archive.com/[email protected]…
Ich war nur bisher _MAIN_H_ gewohnt, deshalb.
Kann man doch mit Hand noch hinzufügen 
Grüße
CMБ
Irgendwie hab ich jetzt unter Netbeans das selbe Problem… Ich muss die .cpp-Dateien direkt einbinden, sonst erhalte ich Fehler in der dazugehörigen .h-Datei und der main.cpp, dass Funktionen verwendet, aber nirgendwo definiert seien (in der main.cpp dann „Undefined reference to…“. Wenn ich das ganze im Terminal über g++ kompilieren lasse und dabei alle .cpp-Dateien angebe, kriege ich dasselbe Ergebnis 
OK, ein weiterer Code zum Testen:
main.h:
#include
using namespace std;
#ifndef \_MAIN\_H
#define \_MAIN\_H
#endif /\* \_MAIN\_H \*/
main.cpp:
#include
#include "main.h"
#include "testclass.h"
/\*
\*
\*/
int main(int argc, char\*\* argv)
{
TestClass tc;
tc.SetI(5);
cout
_testclass.h_:
#include
using namespace std;
#ifndef \_TESTCLASS\_H
#define \_TESTCLASS\_H
class TestClass
{
public:
inline int GetI();
inline void SetI(int value);
private:
int m\_i;
};
#endif /\* \_TESTCLASS\_H \*/
_testclass.cpp_:
#include "testclass.h"
inline void TestClass::SetI(int value)
{
this-\>m\_i = value;
}
inline int TestClass::GetI()
{
return this-\>m\_i;
}
Ich bekomme die oben aufgeführten Fehler.
Hallo
testclass.cpp:
#include „testclass.h“
inline void TestClass::SetI(int value)
{
this->m_i = value;
}
inline int TestClass::GetI()
{
return this->m_i;
}
Ich bekomme die oben aufgeführten Fehler.
Was meinst Du bedeutet „inline“?
Grüße
CMБ
So viel ich weiß, ist das eine Empfehlung an den Compiler, die Funktion nicht wirklich aufzurufen sondern den Code an die jeweilige Stelle zu kopieren. Hätte ich jetzt nicht gedacht, dass das zu Problemen führt. Ist es wegen dem Zugriff auf die private Variable m_i ein Problem?
Hallo
So viel ich weiß, ist das eine Empfehlung an den Compiler, die
Funktion nicht wirklich aufzurufen sondern den Code an die
jeweilige Stelle zu kopieren.
OK, nun überleg mal was passiert, wenn in C++
einzelne cpp-Dateien in der Kompilation
voneinander unabhängige Module sind.
Hätte ich jetzt nicht gedacht, dass das zu
Problemen führt. Ist es wegen dem Zugriff auf
die private Variable m_i ein Problem?
Nicht ganz, aber Du kriegst es schon noch raus 
Grüße
CMБ
Stimmt, es wäre eine andere Fehlermeldung gekommen, wenn es daran gelegen hätte.
Liegt es daran, dass der Compiler den Code kennen muss, wenn er ihn ja kopieren soll? Sonst fällt mir nichts ein, woran es noch liegen könnte…