2012-06-25 5 views
4

Я не уверен в этом и немного искал, что-то особенно полезное. Итак, предположим, что у меня есть заголовочный файл с пространством имен, который содержит некоторые классы C1 и C2;Автономные функции/данные в C++

namespace my_namesp { 

class C1 { 
public: 
    blah1; 
    ... 
private: 
    blah2; 
... 
}; 

class C2 { 
public: 
    junk1; 
    ... 
private: 
    junk2; 
    ... 
}; 

} //-End namespace 

Теперь предположим, что в реализации (СРР), я все функции-члены С1, С2 определены, то предположим, что у меня есть некоторые общие данные, которые я хочу C1 и C2, чтобы разделить, скажем, перечисление и string array, но я не обязательно хочу, чтобы они были частью любого класса. Тогда законно ли сделать следующее (примечание: оно строит и прекрасно работает); и как насчет того, экспортирую ли я эту реализацию в виде библиотеки для клиентского приложения? Будет ли это работать? Разве такой дизайн нахмурился по какой-либо причине, о которой я должен знать? Возможно, конкретная особенность ООП может быть лучше подходит для такого рода вещей?

namespace my_namesp { 

enum some_list_num { 
    list_member1, 
    list_member2, 
    ..., 
    list_length 
} 

static const std::string string_list[] = { 
    str1, 
    str2, 
    ..., 
    strN 
} 

return_type C1::some_func1(...) { 
    ... 
} 

... 

return_type C1::some_func1(...) { 
    ... 
} 

} //-End my namespace 

Заранее благодарим за любые идеи/исправления.

+2

Да, это нормально. –

+0

Спасибо @MooingDuck Это был ответ, который я надеялся услышать! –

ответ

7

Если C1 и C2 имеют некоторые детали реализации, которые должны быть локальными для единицы перевода, это нормально.

Лучше помещать их в анонимное пространство имен в файле cpp, поэтому позже не будет риска столкнуться с символом линкера (то есть, если клиент библиотеки случайно добавит что-то в ваше пространство имен и случайно повторно использует один из ваших " частные "имена).

СРР файл может выглядеть следующим образом:

namespace { // private implementation details 

    enum some_list_num { 
     list_member1, 
     list_member1, 
     ..., 
     list_length 
    } 

    static const std::string string_list[] = { 
     str1, 
     str2, 
     ..., 
     strN 
    } 

} 

namespace my_namesp { // define externally-visible functions etc. 

    return_type C1::some_func1(...) { 
     ... 
    } 

    return_type C1::some_func1(...) { 
     ... 
    } 
} 
+4

Если клиент добавляет что-то в пространство имен библиотеки, они заслуживают того, что они получают, IMO. –

+0

@Ben: Я второй это. ЛОЛ. –

+0

Спасибо @Ulessess: Хорошая точка, тем не менее. –

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