2012-03-25 7 views
0

Ich habe einen Namensraum in C++, der 5 Klassen enthält. Alle von ihnen haben public Zugriffsmodifikator. Davon sind 2 Klassen static Klassen.Wie schränkt man die Sichtbarkeit einer Klasse außerhalb des Namensraums ein, in dem sie deklariert wird?

Ich möchte diese Klassen außerhalb des Namensbereichs, in dem sie deklariert sind, sichtbar machen.

Also, wie in einem anderen Namespace, wenn diese Namespace importieren, sollten diese 2 Klassen nicht verfügbar sein.

+0

Es gibt keine statischen Klassen in C++. Was meinst du mit * "2 Klassen sind statische Klassen" *? – Nawaz

Antwort

1

Ich würde versuchen, die beiden statischen Klassen in einen anderen Namespace zu setzen und diesen Namespace in den Implementierungsdateien der anderen 5 Klassen nutzbar zu machen. Weitere Ideen möglich, wenn Sie minimale Beispielquelle angeben.

2

In C++ gibt es keine statischen Klassen. Wenn unter statische Klassen Hilfsklassen gemeint sind, die von anderen Klassen in Ihrem Code verwendet werden und nicht vom Clientcode verwendet werden sollen, können Sie unbenannten Namespace verwenden und die darin enthaltenen Hilfsklassen definieren.

namespace somespace 
{ 
    namespace //it is unnamed namespace 
    { 
      class helper 
      { 
       //define it here 
      }; 
    } 
    class A 
    { 
      helper m_helper; 
    }; 
} 

Boost verwendet auch eine andere Technik. Es definiert alle Hilfsklassen in einem Namespace namens details.

namespace somespace 
{ 
    namespace details //it is details namespace 
    { 
      class helper 
      { 
       //define it here 
      }; 
    } 
    class A 
    { 
      details::helper m_helper; //use fully-qualified name 
    }; 
} 
+0

Ich scheint in der Lage zu sein, auf diese versteckte Klasse außerhalb des Namensraums zuzugreifen, indem ich 'somespace :: helper' verwende. Habe ich etwas falsch verstanden? –

+0

@ Deidara-senpai: Das können Sie nicht von * anderen * Übersetzungseinheiten. Auf Namen aus unbenanntem Namespace kann nicht von anderen Übersetzungseinheiten zugegriffen werden. Das ist der Sinn dieser Antwort. – Nawaz

+0

Funktioniert das auch für Header oder nur verknüpfte Implementierungsdateien? – jiggunjer

1

Es gibt 2 Möglichkeiten mithilfe von Klassen in C++, ersten zu verhindern, ist diese Klassen privat und in der Klasse verschachtelt zu machen, wo Sie gehen, sie zu benutzen.

class User{ 
private: 
    class Internal{}; 
}; 

Die zweite Möglichkeit ist der Konstruktor der Klasse private und erklären die Freund-Klassen machen die in der Lage sein wird, es zu benutzen mag:

class Internal{ 
private: 
friend class User; 
Internal(){} 
public: 
//class interface. 
}; 
Verwandte Themen