Fehler im Code



  • Hi,

    ich hoffe, ich bin in der Sektion richtig. Ich bin gerade dabei von PHP auf C++ umzulernen und will eine Klasse schreiben, die einen Punkt in einem 3D-Koordinatensystem erstellt. Zum Testen des Scripts soll zum Schluss der Abstand (hyp) vom "Point" zum Nullpunkt rauskommen. Nur tu' ich mich wohl etwas mit der OOP-Syntax in schwer.

    Mein Code sieht so aus:

    #include <iostream>
    #include <math.h>
    
    class Point
    {
          public: 
                  int id;               // ID des Punktes
                  bool sight;            // Ist dieser Punkt vom Nullpunkt aus sichtbar?
                  float hyp;            // Direkter Abstand zum Nullpunkt (Hypotenuse)
                  float x;              // X-Wert / Ankathede
                  float y;              // Y-Wert
                  float z;              // Z-Wert
    
                  // Konstruktor:
                  Point(int id, float x, float y, float z, bool sight)
                  {
                            this->id = id;
                            this->x = x;
                            this->y = y;
                            this->z = z;
                            this->sight = sight;
                  }
    
                  float getHyp(float x, float y, float z)
                  {
                        float a = y;
                        float b = sqrt(pow(x, 2) + pow(z, 2));
                        float c = sqrt(pow(a, 2) + pow(b, 2));
    
                        return c;
                  }
    
    }
    
    int main()
    { 
    
        float hyp;
        Point = new Point(1, 3.0, 3.0, 3.0);   
        hyp = Point->getHyp(Point1->x, Point1->y, Point1->z);
    
        cout << hyp << endl;
        return 1;
    }
    

    Wäre ziehmlich super, wenn mir jemand sagen kann, was an dem Code falsch ist, weil mein Compiler folgende Fehler ausspuckt:

    37 C:\Users\Michael\Documents\Point.class.cpp new types may not be defined in a return type
    37 C:\Users\Michael\Documents\Point.class.cpp extraneous int' ignored 37 C:\\Users\\Michael\\Documents\\Point.class.cpp \main' must return `int'

    40 C:\Users\Michael\Documents\Point.class.cpp expected primary-expression before '=' token
    40 C:\Users\Michael\Documents\Point.class.cpp no matching function for call to `Point::Point(int, double, double, double)'

    41 C:\Users\Michael\Documents\Point.class.cpp expected primary-expression before '->' token
    41 C:\Users\Michael\Documents\Point.class.cpp `Point1' undeclared (first use this function)

    43 C:\Users\Michael\Documents\Point.class.cpp cout' undeclared (first use this function) 43 C:\\Users\\Michael\\Documents\\Point.class.cppendl' undeclared (first use this function)
    Vielleicht findet jemand noch mehr Fehler, bzw. hat Tipps für mich.



    • Klassendefinitionen müssen mit einem Semikolon abgeschlossen werden, wenn du nicht gleich auch noch eine Instanz der Klasse erstellen willst.
    • Die Methode getHyp braucht keine Parameter, die Klasse kennt doch ihre Member. Du könntest damit andere Werte übergeben, aber wozu soll das gut sein?
    • Was soll Point1 sein? Dieser Bezeichner wurde nirgends deklariert. Vielleicht der vergessene Variablenname? Oder möchtest du dich damit auf den id-Parameter beziehen? Das geht jedenfalls nicht, indem du einfach Zahlen an den Klassennamen dranhängst.
    • Wenn du ein Objekt erstellen willst, musst du erst eine Variable mit passendem Typ deklarieren. "Point =" ist also Quatsch, da ist kein Variablenname drin. Du schreibst ja auch nicht "float =".
    • Beim Konstruktoraufruf fehlt der bool-Parameter.
    • Wenn du ein Objekt mit new erzeugst, brauchst du eine Zeigervariable.
    • Wenn du ein Objekt mit new erzeugst, musst du auch dafür sorgen, es wieder freizugeben, sonst hast du ein Speicherleck.

    Überhaupt müsstest du das Objekt gar nicht mit new erzeugen:

    int main() 
    { 
        Point Point1(1, 3.0, 3.0, 3.0);   
        float hyp = Point1.getHyp(); 
    
        cout << hyp << endl; 
    }
    


  • Vielen Dank für die rasche Antwort!
    Die 3 Fehler aus Zeile 37 sind nun weg.

    edit:
    mein code sieht nun so aus:

    #include <iostream>
    #include <math.h>
    
    class Point
    {
          public: 
                  int id;               // ID des Punktes
                  bool sight;            // Ist dieser Punkt vom Nullpunkt aus sichtbar?
                  float hyp;            // Direkter Abstand zum Nullpunkt (Hypotenuse)
                  float x;              // X-Wert / Ankathede
                  float y;              // Y-Wert
                  float z;              // Z-Wert
    
                  // Konstruktor:
                  Point(int id, float x, float y, float z, bool sight)
                  {
                            this->id = id;
                            this->x = x;
                            this->y = y;
                            this->z = z;
                            this->sight = sight;
                  }
    
                  float getHyp(float x, float y, float z)
                  {
                        float a = y;
                        float b = sqrt(pow(x, 2) + pow(z, 2));
                        float c = sqrt(pow(a, 2) + pow(b, 2));
    
                        return c;
                  }
    
    };
    
    int main()
    {
    
        float hyp;
    
        Point *zeiger = new Point(1, 3.0, 3.0, 3.0, true);   
        hyp = zeiger->getHyp(zeiger->x, zeiger->y, zeiger->z);
    
        cout << hyp << endl;
        return 1;
    }
    

    Jetzt gilt es noch den Fehler mit cout und endl zu beheben. die lib <iostream> ist ja korrekt eingebunde noder nicht?



  • spitfire92 schrieb:

    Vor allem komisch finde ich den Fehler, dass "cout" scheinbar undefiniert sein soll, obwohl die <iostream> eingebunden wurde.

    Das liegt daran, dass cout im Namespace std liegt. Es muss also std::cout heißen.

    Du könntest auch in main eine using-Direktive machen, dann musst du nicht jedesmal std:: schreiben.



  • Vielen Dank für die grosse Hilfe, funktioniert nun endlich (:



  • //Konstruktor:     
                  Point(int id, float x, float y, float z, bool sight)
                  {
                            this->id = id;
                            this->x = x;
                            this->y = y;
                            this->z = z;
                            this->sight = sight;
                  }
    
                  float getHyp(float x, float y, float z)
                  {
                        float a = y;
                        float b = sqrt(pow(x, 2) + pow(z, 2));
                        float c = sqrt(pow(a, 2) + pow(b, 2));
    
                        return c;
                  }
    

    Wieso legst du extra Kopien an? Dann ändert sich doch die Lokale Variable der Funktion und nicht die eigentliche aus der Klasse. Oder nicht?



  • wollte bloß mal fragen was ich für einen Fehler in der folgente While Schleife habe.
    Weil bei mir fragt sie immer nur eine Abfrage ab.

    while((blueValue !=30)&&(greenValue!= 25)&&(redValue!=227))

    //* wenn bluevalue=30 and greenValue=25 and redvalue = 227 dann.....

    {
    ....
    }



  • zwingling schrieb:

    wollte bloß mal fragen was ich für einen Fehler in der folgente While Schleife habe.
    Weil bei mir fragt sie immer nur eine Abfrage ab.

    while((blueValue !=30)&&(greenValue!= 25)&&(redValue!=227))
    
    //* wenn bluevalue=30 and greenValue=25 and redvalue = 227 dann.....
      
    {
     ....
    }
    

    Wie jetzt?

    Dein Kommentar stimmt mit deiner Bedingung überhaupt nicht überein...

    Willst du das gefragt wird:

    while((blue != 30) && (green != 25) && (red!=227))
            //DoSomething()...
    

    != bedeutet nicht ( Ist nicht (Verneinung) )

    //* wenn bluevalue=30 and greenValue=25 and redvalue = 227 dann.....
    

    Dein Kommentar bedeutet aber genau das:

    while((blue == 30) && (green == 25) && (red == 227))
           //DoSomething()...
    

    Lg



  • Danke.
    Nun funktioniert mein Prog 😉



  • zwingling schrieb:

    Danke.
    Nun funktioniert mein Prog 😉

    Immer wieder gerne 🙂


Anmelden zum Antworten