Klassen



  • Warum funkioniert folgendes Programm nicht?

    #ifndef FIGUR_HPP
    #define FIGUR_HPP
    
    class figur
    {
          public:
                 figur();
          private:
                  int m_Leben;
                  std::string m_Name;
    };
    #endif
    
    #include "Figur.h"
    
    figur::figur()
    {
                  m_Leben=10;
                  m_Name="Spieler";
                  cout<<m_Leben<<endl;
                  cout<<m_Name<<endl;
    }
    
    #include<iostream>
    #include<string>
    using namespace std;
    class figur
    {
    public:
    figur()
    {
           m_Leben=10;
           m_Name="Spieler";
    }
    private: 
           int m_Leben;
           std::string m_Name;
    
    int main()
    {
        figur figur;
        return 0;
    };
    


  • Weil die dritte Datei nicht kompiliert werden kann.



  • Aus der Fehlerbeschreibung schliesse ich, dass es einfach falsch ist 🙄 . Genauer lässt sich das kaum sagen.



  • figur figur; sieht seltsam aus, findest du nicht? Als Compiler hätte ich keine Ahnung was du meinst wenn du da zweimal denselben Typ hinschreibst. Als Mensch würde ich dir empfehlen für Typen und Variablen verschiedene Namen zu wählen.



  • Da sind so einige Fehler drin.

    1. In Figur.h kennt er string nicht (warum #define FIGUR_HPP, wenn die Datei Figur.h heisst? Besser vielleicht #define FIGUR_H)
    2. In main.cpp fehlt die Abschließende Klammer mit Semikolon

    ;)
    

    für die Klassendeklaration von figur
    3. Als Identifier ist in main.cpp nicht der Klassenname selbst zugelassen.


  • Mod

    Thilo87 schrieb:

    3. Als Identifier ist in main.cpp nicht der Klassenname selbst zugelassen.

    nwp3 schrieb:

    figur figur; sieht seltsam aus, findest du nicht? Als Compiler hätte ich keine Ahnung was du meinst wenn du da zweimal denselben Typ hinschreibst.

    Entgegen der hier anscheinend verbreiteten Meinung ist das absolut kein Problem. Das wäre ja auch schlimm, wenn dem nicht so wäre. Man müsste sonst schließlich sämtliche Typbezeichner kennen, die im Projekt vorkommen, wenn man einen Objektbezeichner wählt. Und wehe, es käme später ein Typ dazu, der zu einem Konflikt führt. Klingt unpraktisch, oder?

    Lediglich die Bezeichner für die Basisdatentypen darf man, wie alle Schlüsselwörter, nicht anderweitig benutzen.

    http://ideone.com/58KzWc



  • Ja, der Compiler akzeptiert das wohl. Gut finde ich es aber nicht. Was ist z.B. mit folgendem Beispiel

    class Test
    {
    	int j ;
    
    public:
    	Test ()
    		: j( 0 )
    	{ }
    
    	Test ( int i )
    		: j( i )
    	{ }
    
    	int operator () ( int i ) const
    	{
    		return j + i ;
    	}
    
    	friend ostream& operator << ( ostream& ostr, Test const& test )
    	{
    		return ostr << test.j ;
    	}
    } ;
    
    int main ( )
    {
    	Test Test( 2 ) ;
    	cout << Test( 3 ) ;
            return 0 ;
    }
    

    Da ist ziemlich unklar, ob jetzt bei cout << Test( 3 ) der ()-Operator oder Initialisierungskonstruktor aufgerufen wird. Tatsächlich wird der ()-Operator aufgerufen und 5 ausgegeben. Benennt man Test in Testxyz um, wird der Initialisierungskonstruktor gerufen und 3 ausgegeben.


  • Mod

    Das ist auch nicht ganz der Sinn der Sache. Wobei aber die Regeln, was passiert eigentlich recht intuitiv sind. Der eigentliche Sinn ist so etwas:

    // irgendwo ganz weit weg
    class foo;
    
    // irgendwo ganz woanders
    int foo; // kein Problem
    

Anmelden zum Antworten