Qt "a1 was not declared in this scope"



  • Hey,

    ich bin ein blutiger C++ Anfänger und hab mir jetzt ein Buch darüber ausgeliehen.

    Um den Umgang mit Klassen zu üben, wollte ich mir einen Taschenrechner (auf cmd - Basis) bauen, bei dem Rechnungen (+, -, usw.) über eine Mathematikklasse gelöst werden (ich weis, etwas umständlich, aber es erfüllt den Zweck).
    Folgendermaßen sieht der Code aus (aufs Wesentliche reduziert):

    main.cpp

    #include <QCoreApplication>
    #include <iostream>
    
    #include "mymath.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
       double z1;
       double z2;
    
       do {
           cin >> z1;
           cin >> z2;
           mymath a1(z1, z2);
    
           a1.ausgabe();
    
       } while(1==1);
    
        return a.exec();
    }
    

    mymath.h (Damit ich nicht die mymath.cpp posten muss, hab ich gleich hier die Deklaration rein gemacht)

    #ifndef MYMATH_H
    #define MYMATH_H
    
    #include <iostream>
    
    class mymath
    {
    public:
        mymath(double wert1, double wert2){
         m_wert1 = wert1;
         m_wert2 = wert2;
        }
    
        void ausgabe();
    
    private:
       double m_wert1;
       double m_wert2;
    
    };
    
    void ausgabe(){
        std::cout << "Die werte sind " << a1.wert1 << " und " << a1. wert2 << std::endl;
    }
    
    #endif // MYMATH_H
    

    Der Compiler gibt mir jetzt folgende Fehlermeldung: "'a1' was not declared in this scope". Außerdem zeigt Qt die Variable a1 beim Kostruktoraufruf als unbenutzt an.
    Ich verstehe nicht, warum bei dem Aufruf der Methode das Objekt a1 plötzlich nicht mehr da ist. Hat das was mit dem Bezugsrahmen zu tun?

    Liebe Grüße, RoyalRIDEr.



  • Ich seh auch kein a1, höchstens z1.



  • RoyalRIDEr schrieb:

    Der Compiler gibt mir jetzt folgende Fehlermeldung: "'a1' was not declared in this scope".

    Es ist immer hilfreich, wenn du auch die Stelle angibst, an der der Compiler sich beklagt.

    Es geht um die freie Funktion ausgabe. Dort gibt es kein a1. a1 gibt es nur in main.

    Außerdem sollte ausgabe keine freie Funktion sein. Du hast in mymath eine Methode ausgabe deklariert, aber definiert hast du sie nicht. Dazu müsste an der Definition mymath::ausgabe stehen.

    Aber auch dann gibt es im Scope dieser Methode kein a1. Dort hast du direkten Zugriff auf die Member. Die heißen allerdings nicht wert1 und wert2, sondern m_wert1 und m_wert2.



  • Ich seh auch kein a1, höchstens z1.

    In Zeile 20 in main.cpp wird doch ein Objekt a1 konstruiert.

    Es ist immer hilfreich, wenn du auch die Stelle angibst, an der der Compiler sich beklagt.

    Es handelt sich um die mymath.h Zeile 23... wo das ausgegeben wird.

    Die heißen allerdings nicht wert1 und wert2, sondern m_wert1 und m_wert2.

    Oh... peinlich. Wie konnte das denn passieren^^ Danke.

    Es geht um die freie Funktion ausgabe. Dort gibt es kein a1. a1 gibt es nur in main.

    Außerdem sollte ausgabe keine freie Funktion sein. Du hast in mymath eine Methode ausgabe deklariert, aber definiert hast du sie nicht.

    Warum ist ausgabe eine freie Funktion? Gehört sie denn nicht zur Klasse mymath, wenn die Deklaration in der Klasse erfolgt? Was muss ich machen, damit die Funktion auf das Objekt zugreifen kann?

    Dazu müsste an der Definition mymath::ausgabe stehen.

    Hab ich gemacht, ändert aber leider nichts.

    EDIT: Was ist eigentlich dieses "scope"? Davon steht nichts in meinem Buch^^



  • RoyalRIDEr schrieb:

    Ich seh auch kein a1, höchstens z1.

    In Zeile 20 in main.cpp wird doch ein Objekt a1 konstruiert.

    Nö. Es wird benutzt, aber es steht nirgends, was das ist. Es ist eine nicht deklarierte Variable.

    Der "scope" ist ein Gültigskeitsbereich. Wenn du z.B. schreibst

    if (condition) {
    int a = 10;
    }
    

    Dann ist a nur in dem Bereich zwischen den geschweiften Klammern gültig.



  • RoyalRIDEr schrieb:

    Warum ist ausgabe eine freie Funktion? Gehört sie denn nicht zur Klasse mymath, wenn die Deklaration in der Klasse erfolgt?

    Du hast da zwei Funktionen:

    Du hast die Methode mymath::ausgabe. Die hast du in der Klassendefinition von mymath deklariert (d.h. du hast dem Compiler gesagt, dass es sie gibt).

    Und dann gibt es die freie Funktion ausgabe, die du direkt nach der Klassendefinition definiert hast. Da diese außerhalb der Klassendefinition steht, hat sie nichts mit der Klasse zu tun, auch wenn sie zufällig denselben Namen hat wie die Methode mymath::ausgabe.

    Wenn du eine Methode außerhalb der Klasse definierst, musst du den Klassennamen dazu schreiben, sonst definierst du einfach nur eine freie Funktion mit demselben Namen.



  • Der "scope" ist ein Gültigskeitsbereich. Wenn du z.B. schreibst

    if (condition) {
    int a = 10;
    }
    

    Achso... also der Namensbereich.

    Du hast die Methode mymath::ausgabe. Die hast du in der Klassendefinition von mymath deklariert (d.h. du hast dem Compiler gesagt, dass es sie gibt).

    Und dann gibt es die freie Funktion ausgabe, die du direkt nach der Klassendefinition definiert hast. Da diese außerhalb der Klassendefinition steht, hat sie nichts mit der Klasse zu tun, auch wenn sie zufällig denselben Namen hat wie die Methode mymath::ausgabe.

    Okay, wenn du es so sagst, klingt es logisch.

    Ich weis jetzt, was ich falsch gemacht habe: Die Methode wird doch über das Objekt aufgerufen und deshalb kann man die Attribute einfach so ansprechen, also nicht so:

    std::cout << "Die werte sind " << a1.m_wert1 << " und " << a1. m_wert2 << std::endl;
    

    sondern so:

    std::cout << "Die werte sind " << m_wert1 << " und " << m_wert2 << std::endl;
    

    Vielen Dank an euch!

    Aber jetzt habe ich ein Problem, welches ich kein bisschen nachvollziehen kann. Die mymath.h sieht jetzt so aus:

    #ifndef MYMATH_H
    #define MYMATH_H
    
    #include <iostream>
    
    class mymath
    {
        double m_wert1;
        double m_wert2;
    
    public:
    
        mymath(double wert1, double wert2){
         m_wert1 = wert1;
         m_wert2 = wert2;
        }
    
        void ausgabe();
    
            // Da steht noch bisschen was anderes, aber die Zeilen sollen ja hinhauen
    
    };
    
    void mymath::ausgabe(){
        std::cout << "Die werte sind " << m_wert1 << " und " << m_wert2 << std::endl;
    }
    
    #endif // MYMATH_H
    

    So, jetzt sagt der Compiler, dass es eine Doppeldefinition von "ausgabe" gibt. Angeblich soll die Methode das Erst mal in Zeile 25 definiert sein, obwohl sie ja leer ist! Woran liegt das?



  • Bitte zeig die echte Fehlermeldung, nicht deine Interpretation. Und am besten gerade so viel Code, dass man das reproduzieren kann. In wie vielen .cpp-Dateien bindest du diese Headerdatei denn ein?


Anmelden zum Antworten