Управление параллельной разработкой пакета NuGet

По умолчанию использовать функции с именами.

Классы должны создавать объекты, а не заменять пространства имен.

В объектно-ориентированном коде

Скотт Мейерс написал целый предмет для своей эффективной книги на C ++ по этой теме: «Предпочитайте функции, не являющиеся членами-членами, для функций-членов». Я нашел онлайн-ссылку на этот принцип в статье из Herb Sutter: http://www.gotw.ca/gotw/084.htm

Важно знать, что: В C ++ функции в том же пространстве имен, что и класс, относятся к интерфейсу этого класса (поскольку ADL будет искать эти функции при разрешении вызовов функций ).

Функции имен, если только объявленный «друг» не имеет доступа к внутренним классам, тогда как статические методы имеют.

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

Расширение I

Добавление кода в класс '.

В C # вы можете добавлять методы в класс, даже если у вас нет доступа к нему. Но в C ++ это невозможно.

Но, все еще на C ++, вы все равно можете добавить функцию с именами, даже в класс, который кто-то написал для вас.

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

Расширение II

Сторона -эффект предыдущей точки, невозможно объявить статические методы в нескольких заголовках. Каждый метод должен быть объявлен в одном классе.

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

Extension III

Основная прохлада пространства имен заключается в том, что в некотором коде вы можете не упоминать об этом, если используете ключевое слово «using»:

#include 
#include 

// Etc.
{
   using namespace std ;
   // Now, everything from std is accessible without qualification
   string s ; // Ok
   vector v ; // Ok
}

string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR

И вы можете даже ограничить «загрязнение» одним классом:

#include 
#include 

{
   using std::string ;
   string s ; // Ok
   vector v ; // COMPILATION ERROR
}

string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR

Этот «шаблон» является обязательным для правильного использования почти стандартного икота свопа.

И это невозможно делать со статическими методами в классах.

Итак, пространства имен C ++ имеют свою собственную семантику.

Но она идет дальше, поскольку вы можете комбинировать пространства имен способом, подобным наследованию.

Например, если у вас есть пространство имен A с функцией AAA, пространство имен B с функцией BBB, вы можете объявить пространство имен C и привести AAA и BBB в это пространство имен с использованием ключевого слова.

Заключение

Пространства имен для n amespaces. Классы предназначены для классов.

C ++ был разработан таким образом, что каждая концепция различна и используется по-разному в разных случаях как решение различных проблем.

Не используйте классы, когда вы нужны пространства имен.

И в вашем случае вам нужны пространства имен.

0
задан Arcane92 19 March 2019 в 11:05
поделиться