Eine Klasse hat DIREKTEN Zugriff auf METHODEN einer anderen Klasse



  • Grüße!

    Ich möchte gerne:

    Klasse A hat DIREKTEN (schnellen) Zugriff auf die public oder privat? Methoden der Klasse B.

    Wie macht man das?



  • Hallo

    wo ist das Problem?

    class B;
    
    class A
    {
      ...
      int func(class& B b) {return b.m_v;};
    };
    
    class B
    {
      private :
      ...
      friend class A;
      int m_v;
    };
    

    bis bald
    akari



  • Hallo,
    Wenn zwischen den Klassen A und B keine Beziehung besteht, dann bleibt dir wohl nur die Möglich keit Klasse B als friend von A zu deklarieren, wodurch Klasse A direkten Zugriff auf _alle_ Methoden von B hat.

    Beispiel:

    class a;
    
    class b
    {
        private:
            void foo() const { cout << "hello world!"; }
            friend class a; // Klasse a zum Freund erklären.
    };
    
    class a
    {
        public:
            void bar(const b& rhs) { rhs.foo(); } // geht aufgrund von friend-deklaration!
    };
    
    int main()
    {
        a a_o;
        b b_o;
        a_o.bar(b_o);
    }
    

    Gruß, Caipi



  • Und wenn Klasse B von Klasse A abgeleitet wird? Kann dann Klasse A schnell direkt auf Methoden von B zugreifen und umgekehrt?



  • Hallo

    wenn B von A abgeleitet ist, dann kann B auf alle public und protected-Member von A zugreifen. A kann nur auf Funktionen von B zugreifen, die in A als virtual angelegt wurden und in B übrschrieben werden.

    bis bald
    aakri



  • Es geht um performance.

    Klasse A hat eine Funktion Tick(), diese soll jedoch die Funktion Tick() von Klasse B aufrufen und das gaaanz direkt und schnell.

    Oder die Klasse A soll irgendwie direkt die Funktion Tick() der Klasse B aufrufen.

    Wie macht man das am besten?



  • Hallo

    grundsätzlich kannst du mit inline die direkte Einbettung vorschlagen. Es gibt im Forumsmagazin einen Artikel darüber.
    Allerdings ist das wie gesagt nur ein Vorschlag für den Compiler. Überlass solche Mikrooptimierungen lieber ganz dem Compiler und kümmere dich lieber um stabilen effizienten Code.

    bis bald
    akari



  • Kan akaris 2. post nur zustimmen.

    Wie sieht der Body von Tick() aus?

    Performance ist auf modernen Systemen hochgradig nichtdeterministisch und hängt hauptsächlich von Speicherzugriffen ab. Bevor man nicht Zeiten gemessen hat (und das ist ein schwieriges Geschäft), sollte man jeder Optimierung mißtrauen.

    -----------------

    Auf Microlevel: Aufruf über Zeiger ist voll OK:

    class B
    {
      A * a;
      void Do() 
      { ...; 
        a->Tick(); 
        ... 
      }
    }
    

    Im schlimmsten fall muß gegenüber einem direkten Aufruf noch rein:

    mov register, [this]
    mov ecx, [register+offset B::a]
    

    Das kann gane 0 Takte kosten dauern wenn es von einer sonst unbeschäftigten Pipeline übernommen wird, oder auch mehrere Minuten (swapfile auf fauliger Diskette).

    Wenn du die Methode aber so häufig aufrufst, daß sich deine Bedenken lohnen, sind die Register eh' schon geladen. Und wenn nicht, denk einfach dran: 3GHz, 4 pipelines, da schaffst du locker 5000000000 Befehle / Sekunde. Im Mittel und ohne Speicherzugriffe hinter dem 1st Level Cache.



  • Naja, es ist so:

    Klasse A soll Klasse B sozusagen "steuern". Klasse A soll somit ohne performance-einbußen eine Methode von Klasse B aufrufen können.

    Tick() ist ein frame, daher könnt ihr euch vorstellen, wie schnell das laufen sollte.

    (Obwohl, ist es nicht eigentlich egal? Hauptsache mindestens 30x wird die Methode auugerufen?!)



  • Bei 30x pro Sekunde ist die Art des Aufrufs wirklich zu vernachlässigen. Ja, eine Handvoll Nanosekunden sind egal 🙂


Anmelden zum Antworten