Wie implementiert man eine Identity Map in C oder C++?

In C oder C++ lässt sich eine einfache Identity Map mithilfe einer Hash Map, eines Arrays oder einer Pointer-Tabelle realisieren. Dabei wird jedem eindeutigen Schlüssel (z. B. Sensor-ID, Adresse, Objekt-Typ) eine Instanz zugeordnet. Neue Objekte werden nur erzeugt, wenn sie noch nicht in der Map vorhanden sind. Für kleine Systeme kann man statisch allokierte Arrays oder Pointer-Listen mit Lookup-Funktionalität verwenden.

Beispiel:

#include <iostream>
#include <unordered_map>

// Simulierter Sensor
class Sensor {
public:
Sensor(int id) : id(id) {
std::cout << "Sensor " << id << " erstellt\n";
}

int readValue() {
// Simulierter Sensorwert
return id * 10;
}

private:
int id;
};

// Identity Map für Sensorobjekte
class SensorMap {
public:
Sensor* getSensor(int id) {
auto it = sensors.find(id);
if (it != sensors.end()) {
return it->second;
}

// Objekt noch nicht vorhanden → neu anlegen
Sensor* sensor = new Sensor(id);
sensors[id] = sensor;
return sensor;
}

~SensorMap() {
// Aufräumen (wichtig im Embedded-Kontext!)
for (auto& pair : sensors) {
delete pair.second;
}
sensors.clear();
}

private:
std::unordered_map sensors;
};

// Beispielverwendung
int main() {
SensorMap sensorMap;

Sensor* s1 = sensorMap.getSensor(1);
Sensor* s2 = sensorMap.getSensor(2);
Sensor* s1_again = sensorMap.getSensor(1); // Kein neues Objekt!

std::cout << "s1 Wert: " << s1->readValue() << "\n";
std::cout << "s2 Wert: " << s2->readValue() << "\n";
std::cout << "s1_again Wert: " << s1_again->readValue() << "\n";

return 0;

}
com

Newsletter Anmeldung

Bleiben Sie informiert! Wir informieren Sie über alle neuen Beiträge (max. 1 Mail pro Woche – versprochen)