Statisches C++11-Konstruktormuster, das für mehrere Objekte funktioniert
Eine Redewendung wurde bei vorgeschlagen: https://stackoverflow.com/a/27088552/895245 aber hier ist eine sauberere Version, die nicht die Erstellung einer neuen Methode pro Mitglied erfordert.
main.cpp
#include <cassert>
#include <vector>
// Normally on the .hpp file.
class MyClass {
public:
static std::vector<int> v, v2;
static struct StaticConstructor {
StaticConstructor() {
v.push_back(1);
v.push_back(2);
v2.push_back(3);
v2.push_back(4);
}
} _staticConstructor;
};
// Normally on the .cpp file.
std::vector<int> MyClass::v;
std::vector<int> MyClass::v2;
// Must come after every static member.
MyClass::StaticConstructor MyClass::_staticConstructor;
int main() {
assert(MyClass::v[0] == 1);
assert(MyClass::v[1] == 2);
assert(MyClass::v2[0] == 3);
assert(MyClass::v2[1] == 4);
}
GitHub vorgelagert .
Kompilieren und ausführen:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out
Siehe auch: statische Konstruktoren in C++? Ich muss private statische Objekte initialisieren
Getestet auf Ubuntu 19.04.
C++17 Inline-Variable
Erwähnt unter: https://stackoverflow.com/a/45062055/895245 aber hier ist ein lauffähiges Beispiel für mehrere Dateien, um es noch deutlicher zu machen: Wie funktionieren Inline-Variablen?
Diese großartige C++17-Funktion ermöglicht es uns:
main.cpp
#include <cassert>
#include "notmain.hpp"
int main() {
// Both files see the same memory address.
assert(¬main_i == notmain_func());
assert(notmain_i == 42);
}
notmain.hpp
#ifndef NOTMAIN_HPP
#define NOTMAIN_HPP
inline constexpr int notmain_i = 42;
const int* notmain_func();
#endif
notmain.cpp
#include "notmain.hpp"
const int* notmain_func() {
return ¬main_i;
}
Kompilieren und ausführen:
g++ -c -o notmain.o -std=c++17 -Wall -Wextra -pedantic notmain.cpp
g++ -c -o main.o -std=c++17 -Wall -Wextra -pedantic main.cpp
g++ -o main -std=c++17 -Wall -Wextra -pedantic main.o notmain.o
./main
GitHub vorgelagert .