[Problem gelöst] G++ - nur Inline Deklaration möglich?



  • Hallo allerseits

    Ich mache meine ersten Gehversuche mit C++ und benutze dazu Dev-C++. Die ganze IDE finde ich relativ gelungen, werde aber demnächst eh auf Linux und somit warscheinlich auf KDevelop umsteigen.

    Nun aber zu meinem Problem. Ich benutze die oben genannte IDE mit dem standardmässig installierten g++ Compiler. Ich finde die GNU-Compilersammlung genial, da man wirklich zu den Standards gezwungen wird. Ein Problem bleibt aber dennoch - ich kann Methoden nur Inline deklarieren!

    Nun, ich habe folgende Klasse:

    // cat.cpp
    
    class Cat
    {
    private:
       int intAge;
    
    public:
       int getAge();
       void setAge(int intNewAge);
    };
    
    int Cat::getAge()
    {
       return (intAge);
    }
    
    void Cat::setAge(int intNewAge)
    {
       intAge = intNewAge;
    }
    
    // main.cpp
    
    #include <iostream>
    #include "cat.cpp"
    
    int main(int argc, char *argv[])
    {
       Cat miez;
       miez.setAge(6);
       std::cout << miez.getAge();
    
       getchar();
       return (0);
    }
    

    Meiner Meinung nach ist die Klassendefinition korrekter C++ Code, so findet man es in jedem (oder zumindest in meinem) Buch und im Internet. Der Compiler meldet aber immer einen Fehler - ich habe angeblich mehrere Definitionen der gleichen Methoden.

    Das Kuriose an der ganzen Sache ist aber folgendes: Wenn ich die Klasse nicht per #include miteinbeziehe, sondern gleich als Code hineinkopiere, funktioniert es prima. Das ist in meinen Augen sehr unlogisch, da #include ja nur eine einfache Textersetzung vornimmt!

    Folgender Code funktioniert also:

    #include <iostream>
    
    class Cat
    {
    private:
       int intAge;
    
    public:
       int getAge();
       void setAge(int intNewAge);
    };
    
    int Cat::getAge()
    {
       return (intAge);
    }
    
    void Cat::setAge(int intNewAge)
    {
       intAge = intNewAge;
    }
    
    int main(int argc, char *argv[])
    {
       Cat miez;
       miez.setAge(6);
       std::cout << miez.getAge();
    
       getchar();
       return (0);
    }
    

    Was mache ich um himmels Willen falsch!?

    Vielen Dank für eure Hilfe 🙂

    PS: Mein erster Beitrag hier bei euch :p



  • Nabend,

    dein Fehler ist, dass du alles in eine .cpp-Datei packst. Man includiert aber keine
    .cpp-Datei sondern Headerdateien.

    D. h. du packst deine Klassendeklaration in eine .h-Datei und die Implementation
    derselben kommt in eine .cpp-Datei. In der .cpp-Datei includierst du nun die .h-Datei.

    Bei dir sieht das dann wie folgt aus:

    #ifndef catH
    #define catH
    //cat.h
    class Cat
    {
    private:
       int intAge;
    
    public:
       int getAge();
       void setAge(int intNewAge);
    };
    
    #endif
    
    //cat.cpp
    #include "cat.h"
    
    int Cat::getAge()
    {
       return (intAge);
    }
    
    void Cat::setAge(int intNewAge)
    {
       intAge = intNewAge;
    }
    

    Und schliesslich die main:

    #include <iostream>
    #include "cat.h" //.h includieren. die implementation sucht der compiler selbst
    
    int main(int argc, char *argv[])
    {
       Cat miez;
       miez.setAge(6);
       std::cout << miez.getAge();
    
       getchar();
       return (0);
    }
    

    Und jetzt funktioniert das auch alles 🙂

    mfg
    v R



  • Das mit dem Trennen vom Code und Header habe ich auch probiert. Ich habe aber immer die Header-Datei in die .cpp-Datei miteinbezogen, das war wohl mein Fehler. Wenn der Compiler selber suchen will, dann lasse ich ihn halt mal 😉

    Hat übrigens super funktioniert. Danke vielmal für die Hilfe! 🙂

    Gruss, paedubucher



  • spam gelöscht



  • Hi,

    ich mache auch grad ein paar erste Gehversuche in C++.
    Mein erster Eindruck, gegenueber Perl ist ja, dass man hoellisch aufpassen muss, um nicht grossen Murks zu verzetteln. 🙂
    Aber mal kurz eine Nachfrage.
    Du sagst, dass die GNU Compiler einen zum standardkonformen Arbeiten zwingen...
    Laut Manpage arbeitet der g++ aber mit GNU Extensions, die nicht standardkonform sind.
    Standardkonformitaet erhaelt man wohl nur mit der Option: -std=c++98
    Waere schoen, wenn man den per default an den Standard binden koennte.
    Also ausser mit "alias g++='g++ -std=c++98" 😉

    MfG



  • I.C.Wiener schrieb:

    Hi,

    ich mache auch grad ein paar erste Gehversuche in C++.
    Mein erster Eindruck, gegenueber Perl ist ja, dass man hoellisch aufpassen muss, um nicht grossen Murks zu verzetteln. 🙂
    Aber mal kurz eine Nachfrage.
    Du sagst, dass die GNU Compiler einen zum standardkonformen Arbeiten zwingen...
    Laut Manpage arbeitet der g++ aber mit GNU Extensions, die nicht standardkonform sind.
    Standardkonformitaet erhaelt man wohl nur mit der Option: -std=c++98
    Waere schoen, wenn man den per default an den Standard binden koennte.
    Also ausser mit "alias g++='g++ -std=c++98" 😉

    MfG

    Standardkonformität ist mir vorallem bei C aufgefallen. Ich habe da vermeintlichen C-Code aus VS von Microsoft übernommen, der hat bestimmt 100 mal auf 200 Zeilen geschossen. Die Fehlermeldungen besagten jeweils, dass die jeweiligen Codepassagen nicht ANSI C99 konform sind.
    Wie kann ich deine besagte Option in meine IDE "einbauen"? Muss ich das immer als Parameter bei jedem Kompiliervorgang mitgeben?

    EDIT: In den Projektoptionen habe ich die Möglichkeit zur Parametervergabe. Muss ich diesen Parameter dem Compiler, dem C++Compiler oder dem Linker übergeben?



  • Alles schön und gut aber ich würde behaupten der Linker sucht 😉


Anmelden zum Antworten