Funktion einer Klasse aufrufen, ohne objekt zu erzeugen???



  • Hallo,
    wenn ich mich richtig erinnere habe ich mal gelesen, dass es geht klassen(mit funktionen) zu schreiben, von denen man die funktionen auch ausführen kann ohne ein objekt der klasse zu erzeugen.

    Ich habe nämlich in einem Programm zur Zeit 4 Zeichenfunktionen (dot,line,circle und rectangle). Nun will ich diese funktionen in eine Klasse packen um sie in dieser art aufrufen zu können: grafik.dot(x,y)
    Ich will allerdings kein Objekt der klasse erstellen müssen, da dies für meinen Zweck sehr umständlich wäre.

    Es hat keinen großen Funktionellen Sinn, ich will es nur machen, damit alles schön in Klassen sitzt, übersichtlich ist und ich die automatische syntax-ergänzung nutzen kann.

    Bevor so beiträge kommen wie "Is doch unnötig/Würde ich nicht machen" sage ichs lieber gleich. Ich will es so machen falls es geht, also wenn ihr etwas darüber wisst schreibt es bitte, auch wenn es in eueren Augen unsinnig/unnötig ist.



  • Das geht mit static. Damit kannst du dann Methode so aufrufen:

    Grafik::Dot(par1,par2);
    

    Die Klasse sieht dann so aus:

    class Grafik
    {
    public:
    static int Dot(int par1, int par2);
    };
    
    int Grafik::Dot(int par1, int par2)
    {
    //CODE
    }
    

    EDIT: Mit dem Punkt (Grafik.Dot(1,2);) geht das soweit ich weiß nicht.

    Felix



  • Hallo

    siehe zum Beispiel hier.

    bis bald
    akari



  • Ich hab dich als uncool detectiert!!!

    Das geht [was du willst] so:

    struct Foo {
        static void bar() { /* ... */ }
    }
    
    Foo::bar(); /* call */
    

    Aber es [,das was du WIRKLICK willst] geht so:

    namespace grafik {
        void foo();
    }
    
    void grafik::foo() { /* ... */ }
    
    grafik::foo(); /* call */
    

    👍



  • das ist falsche verwendung von namespaces. gibt nen ld error bei benutzung



  • uncool schrieb:

    das ist falsche verwendung von namespaces. gibt nen ld error bei benutzung

    😕 😕 😕



  • PS: Es ist Absicht dass da Stand-Bye statt Stand-By steht.



  • Hallo

    Ich wollte mal fragen, wo die Vor- und Nachteile der beiden Lösungen sind. Aus OOP-Sicht würde ich mich für Klassen entscheiden. Hat es einen Nachteil, wenn man dies tut, oder ist es schlechter Stil?

    chrische



  • chrische5 schrieb:

    Hallo

    Ich wollte mal fragen, wo die Vor- und Nachteile der beiden Lösungen sind. Aus OOP-Sicht würde ich mich für Klassen entscheiden. Hat es einen Nachteil, wenn man dies tut, oder ist es schlechter Stil?

    chrische

    Da gibts keine Unterschiede. Bloß dass man halt ein Objekt der Klasse anlegen könnte - was keinen Sinn macht, da sie ja bis auf die Statics leer ist. Schlechter Stil ist für *mich*, Klassen zu defnieren, die nur Statics haben. Sowas hat mit OPP gar nichts zu tun. Da finde ich die Lösung mit Namespaces deutlich besser.



  • 👍



  • was hat das denn für einen Sinn wenn ich Klassen mache oder structs oder wie auch immer und davon keine objekte erzeugen möchte um methoden zu verwenden??
    Das hab ich nicht verstanden..



  • Ich persönlich würde auch zur Namespace-Variante tendieren, aber, wenn Du es unbedingt in eine Klasse schreiben willst, und wenn Du davon nur ein (globales) Objekt erzeugst, um einen Zugriff auf die Funktionen zu haben, dann könntest Du es auch so machen:

    struct {
    	void foo() {
    		// do sth.
    	}
    } test;
    
    // Verwendung
    test.foo();
    

    So hast Du Deinen Punkt für die Methodenaufrufe, aber schön finde ich es eigentlich nicht. Wenn etwas thematisch zusammengehört, aber nicht auf ein Objekt angewendet wird, dann gehört das in meinen Augen in einen Namespace und nicht in eine Klasse. 🙂



  • C++ ist ne Multiparadigmensprache, deswegen wäre in C++ die Klassen-Als-Namespace-Missbrauchen-Methode schlechtes C++ und der namespace mit den Methoden drin sauberes C++.

    Die Standardbibliothek verwendet ja auch nen namespace std und kein class/struct std...



  • Klassen haben aber den Vorteil das man private Memberfunktionen haben kann.



  • ü schrieb:

    Klassen haben aber den Vorteil das man private Memberfunktionen haben kann.

    Witzig, macht aber meistens bei Funktione/Static-Members keinen Sinn. Da wäre dann ein Singleton angebrachter.



  • ü schrieb:

    Klassen haben aber den Vorteil das man private Memberfunktionen haben kann.

    // FreeFunc.cpp
    
    namespace {
      void myPrivateFunction();
    }
    

Anmelden zum Antworten