2013-05-04 2 views
0

У меня есть несколько классов. Один класс должен быть видимым для любого, кто ему нужен, а остальные - вспомогательные классы (ну, некоторые из них являются структурами), которые должны быть доступны только для основного класса. Первоначально я реализовал это как вложенный класс внутри основного класса, но это начало заставлять файл заголовка громоздким, поскольку я добавил дополнительные вспомогательные классы. Итак, теперь я помещал вспомогательные классы в отдельное пространство имен с запрещающим видом имени, но я подозреваю, что есть лучший способ. Я хотел бы использовать анонимное пространство имен, но я не могу взять классы-помощники из заголовка, потому что они отображаются как переменные-члены в основном классе.Как я должен скрывать классы-помощники от остального мира?

Вот упрощенный вариант построения, которая находится в моем файле заголовка теперь минус включают охранников:

namespace __TopSecretVisibleNamespace { 
    class Invisible{ 
    }; 
} 

using namespace __TopSecretVisibleNamespace; 
class Visible { 
    public: 
     Visible(); 
    private: 
     Invisible sneaky; 
}; 

Любые мысли?

+3

Обычное соглашение - это пространство имен 'detail'. '__T ...' зарезервирован для реализации (как и любое имя с двойным подчеркиванием * или * ведущее подчеркивание, за которым следует заглавная буква). –

+2

Yup, 'detail'. И не делайте «использование деталей пространства имен», это как бы поражает точку. –

+0

Jerry-Что вы подразумеваете под «зарезервированы для реализации?» Я не могу реализовать классы в другом пространстве имен, чем объявить их, не так ли? Cat - О, спасибо, я думал, что оператор using не выходил за пределы файла заголовка. –

ответ

0

Вы не можете буквально «скрыть» их, но вы можете сделать их недоступными для любого другого класса, используя модификатор protected. Если по какой-либо причине вы не хотите использовать защиту для всех членов класса, вы можете использовать ее только на конструкторе. В этом случае классы non-friend не могут получить доступ к любому члену класса, включая общедоступные.

class Invisible { 
    friend class Visible; 
    protected: 
    Invisible() { 
    } 
    public: 
    // though public, they cannot be called by classes other than Visible, because they can't instantiate the class. 
    int Calc(int n) 
    { 
     return n*n; 
    } 
    int i; 
}; 

class Visible { 
    public: 
    Visible(int i) 
    { 
     Invisible o; 
     x=o.Calc(i); 
    } 
    int x; 
};