Zeiger auf ein Objekt im Kontruktor definieren



  • Also z.B:

    Class Klasse
    {
    private:

    public:
    Klasse();
    ~Klasse();
    void func();

    };

    kann ich auf func() zugreifen, ohne eine Instanz der Class "Klasse" zu haben?



  • Nein! Die Funktion ist ja keine Klassenfunktion (Stichwort: static). Innerhalb der Memberfunktionen, natuerlich schon! 🤡



  • Also, gibt es wirklich keine Möglichkeit auf func() von außerhalb zuzugreifen? auch mit dem this Zeiger?



  • Was soll die Funktion denn machen so voellig ohne Instanz? Wenn Sie nichts mit der Instanz macht ist es entweder eine Klassenfunktion, oder sie gehoert ueberhaupt nicht in die Klasse. 🤡



  • cpplinux schrieb:

    Also, gibt es wirklich keine Möglichkeit auf func() von außerhalb zuzugreifen? auch mit dem this Zeiger?

    ... mit welchen "this-Zeiger" denn ?
    Da ein "this-Zeiger" auf ein Objekt zeigt, wirst Du keinen bekommen ohne ein Objekt zu haben.

    Vielleicht hast Du's ja überlesen:

    Ajaw schrieb:

    ...Stichwort: static...

    Nochmal



  • Ich versuche ein bisschen genauer zu werden:

    Und zwar geht es um eine Client-Server-Anwendung. Wenn sich der Client erfolgreich mit dem Server verbunden hat, dann wird der Konstruktor der Klasse Server "automatisch" aufgerufen.
    Wie das genau abläuft, habe ich nicht verstanden.
    Auf der Server-Seite will ich die Funktionen der Server-Klasse verwenden (z.B. senden con Nachrichten an den Client), ohne dabei sozusagen eine zweite Instanz der Klasse Server zu erstellen.

    Also, die Klasse "Server" ist die Class "Klasse" in meinem Beispiel unten.
    Gibt es eventuell einen Trick, um irgendwie auf die Funktion func() zuzugreifen?

    Grüße,

    CP



  • Du willst im Inneren des Ctors auf die Methode des gerade frisch angelegten Objekts zugreifen - verstehe ich das richtig? Das geht ohne Probleme:

    class Klasse 
    { 
    private: 
    
    public: 
    Klasse()
    {
      func(); // wenn du es unbedingt explizit machen willst, geht auch 'this->func();'
    } 
    ~Klasse(); 
    void func(); 
    };
    


  • Nein, du brauchst schon irgendwo eine Referenz auf ein Objekt dieser Klasse. Wenn dein Server-Konstruktor aufgerufen wird, wird das Objekt ja auch irgendwo (zumindest temporaer) erzeugt. Wenn du noch etwas mit dem Objekt machen willst (wie z.B. Daten an den Client schicken wenn ich das richtig verstanden habe) musst es dir an dieser Stelle eben ganz einfach merken. Daran fuehrt kein Weg vorbei! 😃

    CStoll schrieb:

    Du willst im Inneren des Ctors auf die Methode des gerade frisch angelegten Objekts zugreifen - verstehe ich das richtig?

    Nein, das will er ja gerade nicht! 🤡



  • Daran fuehrt kein Weg vorbei! 😃

    Dieses Connector-Acceptor-Framework der ACE Library ist ja nicht ganz leicht zu verstehen 😞
    Naja, es muss irgendwo in einer Funktion connect_to_server(client, connector, ip, port) passieren.
    Ich hoffe, dass ich das heute noch finde.
    Weiss jemand zufällig, was der ACE_Svc_Handler genau macht?

    Gruß,

    CP



  • Hallo,

    wenn ich:
    1- einen Pointer im Konstruktor definiere, der gleich wie der this Pointer zeigt
    2- Diesen Pointer wo anders im Programm verwende, um auf die Funktion func() zuzugreigfen : also pointer->func();

    Wo liegt dann der Fehler?

    class Klasse 
    { 
    private: 
    
    public: 
    Klasse()
    {
     Klasse* pointer = this;
    } 
    ~Klasse(); 
    void func(); 
    };
    

    Gruß,

    CP



  • Der Fehler in diesem speziellen Beispiel ist dass der Zeiger "pointer" am Ende des Konstruktors nicht mehr existiert.

    Stichwort (mal wieder): static



  • class Klasse 
    { 
        public: 
            static void func(); 
    }; 
    
    int main()
    {
        Klasse::func();
    }
    


  • Hallo

    Stichwort (mal wieder): static

    Ich vermute eher, dass es nötig wäre, den Umgang mit Objekten, Pointern und Referenzen zu lernen. Klar sind Methoden die als static deklariert sind Klassen Methoden, aber ich denke nicht, dass das benötigt wird.

    Simon


Anmelden zum Antworten