Свойство “аддитивности” пространств имен означает, что одно и то же пространство имен может быть объявлено в нескольких местах в программе, и все эти объявления будут объединены компилятором в одно логическое пространство имен. Это позволяет определять и добавлять элементы в пространство имен в разных файлах или частях программы, что упрощает организацию кода.
Пример аддитивности пространств имен
-
Первый файл
// file1.cpp #include <iostream> namespace MyNamespace { void function1() { std::cout << "Function 1 from file1.cpp" << std::endl; } }
-
Второй файл
// file2.cpp #include <iostream> namespace MyNamespace { void function2() { std::cout << "Function 2 from file2.cpp" << std::endl; } }
-
Главный файл
// 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
), что позволяет разделить логику и поддерживать аддитивность пространств имен.
Параметры по умолчанию
Параметры по умолчанию для методов должны быть объявлены в теле класса (в заголовочном файле), где они будут видны всем, кто подключает этот заголовочный файл с классом.