Когда использовать пространство имен или структуру?

Я просто читал немного на них из http://www.cplusplus.com/doc/tutorial/namespaces/, и кажется, что структура способна к тому же самому? Или даже класс в этом отношении. Возможно, кто-то здесь может лучше определить то, что пространство имен, и как оно отличается от структуры/класса?

11
задан Justen 10 April 2010 в 17:55
поделиться

5 ответов

Пространства имен и типы классов не могут выполнять одни и те же функции. Пространства имен в основном используются для группирования типов и функций вместе, чтобы избежать конфликтов имен, в то время как типы классов содержат данные и операции, которые работают с этими данными.

Чтобы просто сгруппировать функции и объекты с помощью типов классов, вам нужно сделать их статическими:

struct X {
    static void f();
};

Без static вам нужно будет создать экземпляры типов классов, чтобы использовать их . Здесь гораздо лучше подходит пространство имен:

namespace X {
    void f();
}

Еще одна важная вещь - использование деклараций и директив:

namespace X {
    void f();
    void g();
}

void h() {
    using X::f;
    f(); // f() now visible in current scope
    using namespace X;
    f(); g(); // both visible
}

Для классов-типов просто не существует механизма, который позволял бы это.

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

18
ответ дан 3 December 2019 в 02:40
поделиться

В C ++ структура точно такая же, как и класс, за исключением того, что структуры по умолчанию являются общедоступными. Занятия частные. Поэтому всякий раз, когда вы хотите сгруппировать бесплатные функции вместе, используйте пространство имен. Если вы хотите сгруппировать данные и функции, используйте структуру / класс и, возможно, пространство имен вокруг всего этого.
Обратите внимание: если вы поместите свои функции в структуру, тогда вам понадобится экземпляр этой структуры, когда вы захотите вызвать эти функции, если они не являются статическими.

1
ответ дан 3 December 2019 в 02:40
поделиться

При создании собственной библиотеки обычно рекомендуется использовать пространство имен для всех экспортируемых функций и классов.

Таким образом, если кто-то включит вашу библиотеку, он не будет загрязнять свое пространство имен, и вероятность конфликта имен будет меньше.

2
ответ дан 3 December 2019 в 02:40
поделиться

Если это можно сделать с помощью пространства имен, используйте пространство имен.

Структура делает гораздо больше, чем определение области видимости. Она определяет тип.

2
ответ дан 3 December 2019 в 02:40
поделиться

Что ж, похоже, все на это идут, поэтому я добавлю свои аргументы.

Перво-наперво, пространство имен и struct - это совершенно разные звери: у них разный синтаксис и разная семантика.

Очевидное:

  • структура вводит тип, который можно использовать в качестве аргумента шаблона
  • пространство имен может быть распределено в нескольких файлах

Синтаксически:

  • ​​оба могут иметь "псевдоним", пространство имен с пространством имен ns = mylong :: name :: space; и структура с typedef mylong :: name :: Space lilstruct;
  • ADL (или Argument Dependent Lookup) адаптирован для пространств имен

Семантически:

  • пространство имен только определяет область определения символов, которая позволяет группировать вместе объекты, которые работают вместе (классы и свободные функции) изолируя их от остального мира (конфликты имен). Как таковой он часто представляет собой логическую единицу работы в рамках проекта (для небольших проектов существует единое пространство имен).
  • структура или класс определяет логическую привязку между данными и методами, которые с ними действуют, что является краеугольным камнем инкапсуляции. Обычно у него есть одна четкая ответственность и несколько инвариантов.

Обратите внимание, что иногда struct или класс просто используется для связывания вместе объектов, которые работают вместе без какой-либо логики, например struct Person {std :: string name , имя; }; .

При этом: в C ++ нет смысла использовать struct из статических методов. Это просто извращение Java или C # и их "чистого" объектно-ориентированного подхода. C ++ поддерживает бесплатные функции, поэтому нет смысла не использовать их, тем более что он лучше для инкапсуляции (у них нет доступа к частным / защищенным частям, поэтому вы не можете испортить инвариант, и они не зависят от представление класса тоже).

7
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: