2012-05-01 2 views
2

Я пишу некоторые функции C++, которые будут генерировать данные, которые могут или не могут быть обработаны позже этими функциями (но не будут обрабатываться нигде). Эти функции являются «низкоуровневыми» для некоторых изменений более высокого уровня, графического интерфейса.Инкапсулирование данных за пределами класса

В настоящее время я обертываю эти функции в отдельном пространстве имен и объявил статический (внутренне связанный) вектор, чтобы содержать эти объекты внутри вектора (объекты определены как структура, также содержащаяся в пространстве имен). Таким образом, общая структура:

namespace Foo 
{ 
    struct Bar 
    { 
     string data; 
    }; 

    void func1(); 
    void func2(); 
    static std::vector<Bar> cachedBars; 
} 

Я действительно не нужен класс для этого, и я не заинтересован в прибегая к одноплодной. Достаточно ли этого решения? В частности, внутренняя связь коллекции пространства имен - лучший способ ограничить доступ к этой коллекции, а также избежать всех ошибок глобальных переменных или есть лучший способ?

+3

Это не избегает любых подводных камней глобального, что с ним является глобальным и всеми. –

+1

Это заголовочный файл? Если это так, вы получите отдельную копию cachedBars везде, где вы включили файл. –

+0

@ Кат: Я надеялся, что это было, по крайней мере, глобально. –

ответ

3

На самом деле, я бы поставил это только декларация функций в .h

void func1(); 
void func2(); 

И скрытый материал в .cpp под анонимным пространством имен.

namespace 
{ 
    struct Bar 
    { 
     string data; 
    }; 

    static std::vector<Bar> cachedBars; 
} 

void func1() { /* do something */ } 
void func2() { /* do something else */ } 

С этим func1 и func2 будут доступны везде, но бар и cachedBars только будет доступен с помощью функций, определенных в .cpp, так func1 и func2. Если в файле .cpp нет ничего другого, только func1 и func2 смогут модифицировать cachedBars.

На всякий случай, если вы не знаете, анонимное пространство имен будет иметь тот же эффект, что и ключевое слово static при использовании для изменения видимости. Тем не менее, он более мощный, так как вы можете скрыть почти что-нибудь с ним.

+0

Разве это не грязное глобальное пространство имен? –

+0

Не совсем. Анонимное пространство имен - это не глобальное пространство имен, а новое, локальное для файла. Таким образом, глобальное пространство имен не будет влиять. Как я уже сказал, это похоже на использование статического ключевого слова. – Morwenn

+0

Сказочные. Rep и галочку для вас. Большое спасибо! –

1

Хорошо. Обычно я делаю в этом случае функции func1() и func2() в файле .h. Пока статический вектор переходит внутрь .cpp вместе с функциональными телами.

Я подозреваю, что вам нужно будет показать struct Bar в файле .h, потому что обычно функции возвращают или принимают эту структуру в качестве параметра. Но если никто не должен знать о структуре, а затем спрятать ее в .cpp. (Также возможно, что только указатели или ссылки передаются/возвращаются. После этого вы можете переадресовать-объявить.)

+0

Это полезно для интерфейсов, но как насчет самого вектора? Является ли внутренняя связь с пространством имен эффективным средством управления доступом к коллекции вне класса или есть лучший способ? –

+2

Еще проще спрятать в .cpp с анонимным пространством имен. Тогда только функции, определенные в.cpp сможет получить доступ ко всему этому. – Morwenn

+0

Большое спасибо за ответ! –

Смежные вопросы