Package access in C++



  • Gibt es sowas wie package access von Java auch in C++?

    Ich will zB eine Klasse Sound und eine SoundManager. Ne Instanz von Sound soll aber nur vom SoundManager erzeugt werden können. Eine Möglichkeit wäre Sound als private Klasse von SoundManager zu definieren, aber dann hab ich Sound nur als Unterklasse. Ich würde lieber so eine Einschränkung wie bei Package access haben.



  • Ja, nennt sich in C++ halt Namespace.



  • Das beste, was du machen kannst, sind namespaces und friend-Zugriff:

    class SoundManager;
    class Sound
    {
    public:
      //wichtige Zugriffsfunktionen
      friend class SoundManager;
    private:
      Sound();
      //alle weiteren Konstruktoren landen hier
    };
    
    class SoundManager
    {
    public:
      SoundManager():data(0){}
      SoundManager(int s_count):data(s_count,Sound()){}
      //weitere Konstruktoren und Zugriffsfunktionen
    private:
      vector<Sound> data;
    };
    


  • Hallo,
    direkt gibt es sowas nicht. Deinen Fall kannst du aber mindestens auf zwei Arten simulieren.
    a) friends: Du machst die Konstruktoren von Sound private und SoundManager zu einem Freund von Sound.

    b) Trennung von Interface und Implementation: Du erstellst für Sound ein Interface (eine abstrakte Klasse in C++) und implementierst eine Klasse die dieses Interface erfüllt in der cpp-Datei von SoundManager (in einem anonymen Namespace).



  • Das mit den fried Klassen ist ganz interessant, aber wie sollen mir namespaces helfen. Gibt es sowas wie namesapce access?

    Ein Interface wollte ich sowieso verwenden.

    Danke erst mal.



  • Nein, der Inhalt eines Namensraumes ist von außen frei zugänglich. Aber ein anonymer Namespace kann nur aus der aktuellen Übersetzungseinheit angesprochen werden:

    //SoundMan.h
    
    class SoundInterface
    {
      //abstrakte Klasse
    }
    
    class SoundManager
    {
      //...
      // verweist notfalls auf SoundInterface
    };
    
    //SoundMan.cpp
    #include "SoundMan.h"
    namespace
    {
      class Sound:public SoundInterface
      {
        //...
        //überschreibt pur virtuelle Methoden
      };
    }
    
    //SoundManager-Methoden: nutzen virtuelle Methoden von SoundInterface, erzeugen aber bei Bedarf Sound-Objekte
    


  • Dann ist es doch wieder so wie ne private Klasse Sound, oder?


Anmelden zum Antworten