[C++] Seltsames Problem mit Headerdatei

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 :wink:

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 :wink:

Grüße

CMБ

Danke, habs geschafft.

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 :frowning:

Hallo

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 :frowning:

Konkret?

Grüße

CMБ

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 :wink:

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…