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

Пример аддитивности пространств имен

  1. Первый файл

    // file1.cpp
    #include <iostream>
     
    namespace MyNamespace {
        void function1() {
            std::cout << "Function 1 from file1.cpp" << std::endl;
        }
    }
  2. Второй файл

    // file2.cpp
    #include <iostream>
     
    namespace MyNamespace {
        void function2() {
            std::cout << "Function 2 from file2.cpp" << std::endl;
        }
    }
  3. Главный файл

    // main.cpp
    #include "file1.cpp"
    #include "file2.cpp"
     
    int main() {
        MyNamespace::function1();
        MyNamespace::function2();
        return 0;
    }

Пример аддитивности с классами

Заголовочный файл

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

// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
 
namespace MyNamespace {
    class MyClass {
    public:
        void method1();
        void method2();
    };
 
    void function1();
    void function2();
}
 
#endif

Исходные файлы

// file1.cpp
#include "myclass.h"
#include <iostream>
 
void MyNamespace::MyClass::method1() {
    std::cout << "Method 1 from file1.cpp" << std::endl;
}
 
void MyNamespace::function1() {
    std::cout << "Function 1 from file1.cpp" << std::endl;
}
 
// file2.cpp
#include "myclass.h"
#include <iostream>
 
void MyNamespace::MyClass::method2() {
    std::cout << "Method 2 from file2.cpp" << std::endl;
}
 
void MyNamespace::function2() {
    std::cout << "Function 2 from file2.cpp" << std::endl;
}

Главный файл

// main.cpp
#include "myclass.h"
 
int main() {
    MyNamespace::MyClass obj;
    obj.method1();
    obj.method2();
 
    MyNamespace::function1();
    MyNamespace::function2();
    return 0;
}

Компиляция

g++ main.cpp file1.cpp file2.cpp -o my_program

Объяснение

  • Единый заголовочный файл: Все методы класса MyClass объявлены в одном заголовочном файле myclass.h, что позволяет компилятору видеть все методы класса при компиляции.
  • Разделенные исходные файлы: Методы и функции определены в отдельных исходных файлах (file1.cpp и file2.cpp), что позволяет разделить логику и поддерживать аддитивность пространств имен.

Параметры по умолчанию

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