Klassenmemberfunktion innerhlab von anderer Klassenmemberdefinition aufrufen?



  • Hey C++ler,

    Die hierfür relevanten Teile, des Programms sehen soaus:

    class Book
    {
    public:
    	//.
             //.
             //.
             void New_Book(int ISBN,string title,string autor);
    	void New_Books();
    	int Search_Book(int ISBN,string title,string autor);
    	void Change_Status(bool change);
    	void Check_Status(int ISBN,string title,string autor);
    	void Check_Data(int n);
    	void Borrow(int ISBN,string title,string autor);
    	void Back(int ISBN,string title,string autor);
    
    };
    
    //................................................................
    
    class User
    {
    public:
             //.
             //.
             //.
    	void Action();
    	void Change_Info(string rname,int age,int pw);//Angaben ändern
    	void Borrow(int ISBN,string title,string autor);//Buch ausleihen
    	void Back(int ISBN,string title,string autor);//Buch zurückgeben
    };
    
    //.
    //.
    //.
    //.
    //.
    //.
    //.
    
    void User::Borrow(int ISBN,string title,string autor) 
    {
    	int pb = Book::Search_Book(ISBN,title,autor);
    	bool change = false;
    	Book::Change_Status(p,change);
    	Users[pu].Book = Books[pb];
    	++Users[pu].activ;
    	Action();
    	return;
    }
    
    void User::Back(int ISBN,string title,string autor) 
    {
    	int pb = Book::Search_Book(ISBN,title,autor);
    	bool change = true;
    	Book::Change_Status(pb,change);
    	Users[pu].Book.ISBN = "...";
    	Users[pu].Book.title = "Kein Buch ausgeliehen";
    	Users[pu].Book.title = "...";
    	Action();
    	return;
    }
    

    Der Compiler meldet mehrere Fehler bei Book:: in den 2 Funktionen am Ende.
    Fehlermeldung:
    'Book::Search_Book': Unzulässiger Aufruf einer nicht statischen Memberfunktion usw......

    Warum kann eine Memberfunktion von User keine Memberfunktionen von Book aufrufen? Was mach ich falsch?



  • Tust du mir einen gefallen und postest es nochmal ein wenig übersichtlicher 😉

    EDIT: aber bitte mit Edit-Funktion 😉



  • Search_Book ist keine statische Funktion. Wenn du nicht weißt, was das ist, haben wir das Problem bereits gefunden 😉



  • Golfi1812 schrieb:

    class Book
    {
    public:
            void New_Book(int ISBN,string title,string autor);
    	void New_Books();
    	int Search_Book(int ISBN,string title,string autor);
    	void Change_Status(bool change);
    	void Check_Status(int ISBN,string title,string autor);
    	void Check_Data(int n);
    	void Borrow(int ISBN,string title,string autor);
    	void Back(int ISBN,string title,string autor);
    
    };
    
    class User
    {
    public:
    	void Action();
    	void Change_Info(string rname,int age,int pw);//Angaben ändern
    	void Borrow(int ISBN,string title,string autor);//Buch ausleihen
    	void Back(int ISBN,string title,string autor);//Buch zurückgeben
    };
    
    void User::Borrow(int ISBN,string title,string autor) 
    {
    	int pb = Book::Search_Book(ISBN,title,autor);
    	bool change = false;
    	Book::Change_Status(p,change);
    	Users[pu].Book = Books[pb];
    	++Users[pu].activ;
    	Action();
    	return;
    }
    
    void User::Back(int ISBN,string title,string autor) 
    {
    	int pb = Book::Search_Book(ISBN,title,autor);
    	bool change = true;
    	Book::Change_Status(pb,change);
    	Users[pu].Book.ISBN = "...";
    	Users[pu].Book.title = "Kein Buch ausgeliehen";
    	Users[pu].Book.title = "...";
    	Action();
    	return;
    }
    

    Book::XYZ ----> Mit dieser Syntax spricht man etwas Statisches aus einer Klasse an. Deine Klasse hat nichts statisches.



  • Gut ich habe die Memberfunktion von Book mit static versehen, jetzt klappts, aber was für eine Funktion hat dieses static?Was "macht"es eigentlich?



  • Ach komm, das kannst du Googlen 🕶

    Kurze erklärung:
    static erzeugt eine einmalige Instanz von etwas. Beispiel:

    #include <iostream>
    
    int myfunc()
    {
    	static int a=1;
    	std::cout << a++ << '\n';
    }
    
    int main()
    {
    	for(int ct=0; ct<5; ++ct)
    		myfunc();
    }
    

    In diesem Beispiel wird die Variable a nur einmal erzeugt, und jedes mal im Funktionsablauf wiederverwendet. Bei Klassen hieße das, static-Member und -Funktionen werden nur einmal erzeugt und müssen außerhalb der Klasse definiert werden (was Variablen angeht 😉 ).

    Edit: Beispiel mit Klassen:

    #include <iostream>
    
    struct A
    {
    	static int population;
    	static int get_population() {return population;}
    };
    
    int A::population = 2;
    
    int main()
    {
    	std::cout << A::population << '\n'
    		 << A::get_population() << '\n';
    }
    

Anmelden zum Antworten