NULL-Wert als zusätzliche Attribut-Eigenschaft

Hallo lieber wer-weiss-was-Experte,

wie kann die Information, dass ein Datenobjekt keinen Wert enthält, performant realisieren?
In C++ kann man einem Datentyp ja nicht einfach eine NULL zuweisen, falls man dynamische Speicherverwaltung (new/malloc) nicht verwenden möchte. Was gibt es für Möglichkeiten, (vielen) Attributen einer Klasse z.B. Datenbank-NULL-Werte mitzugeben.

Hier ein paar Vorschläge, je weiter oben, desto weniger kommt die Lösung in Frage:

  • VARIANT-Datentyp: MFC kennt nur vorgegebene Typen, .NET [2.0] kann ich nicht verwenden
  • Für jedes Attribut einen Wahrheitswert, ob belegt oder nicht: Speichermenge (fast Verdopplung wg. interner Abbildung als Int)
  • Bitliste mit Zugriffsroutine über enum-Werte: jeder Zugriff erfordert eine Überprüfung und dann erst ein Holen des Wertes

Kennt jemand eine weitere Möglichkeit?

Gruß & Dank
Marc

Hallo

wie kann die Information, dass ein Datenobjekt keinen Wert
enthält, performant realisieren?
In C++ kann man einem Datentyp ja nicht einfach eine NULL
zuweisen, falls man dynamische Speicherverwaltung (new/malloc)
nicht verwenden möchte. Was gibt es für Möglichkeiten,
(vielen) Attributen einer Klasse z.B. Datenbank-NULL-Werte
mitzugeben.

Entweder opferst Du einen bestimmten Wert aus
dem Wertebereich, der sonst nicht vorkommt, z.B.:

 int i\_false = INT\_MIN;
 double d\_false = DBL\_MIN;
 ...
 if( i != i\_false ) {
 ...

Oder Du erzeugst einen Bitvektor
von der Größe Deiner Datenarrays:

 bitset datamapper;
 ...
 datamapper.set( i );
 ...
 if( datamapper[i] ) {
 ... use data # i
 }

(vgl.: http://www.josuttis.com/libbook/cont/bitset1.cpp.html)

Grüße

CMБ

Hallo Marc,

in einer OO-Sprache bietet es sich natürlich an, solche Werte als Objekt zu entwerfen mit der Gültigkeit als Attribut und z.B. einer Zahl oder einem String. Einerseits wird dann alles, was die Gültigkeit betrifft, nur einmal programmiert und dann vererbt, andererseits hast du eben den Speicherbedarf für jeweils ein Objekt zu akzeptieren. Ist aber für den Programmierer am übersichtlichsten, deswegen macht man ja OO (wenn die Programmierer perfekt arbeiten würden, bräuchte man keine OO).

In der Datenbank sieht das anders aus, da würde ich nicht die Objekte direkt speichern, sondern eben den String oder was auch immer und einen logischen (bool) Wert dazu. Dann ist das auch transparent für andere Benutzer der Daten. Es kann auch sein, dass die Datenbank dafür Vorkehrungen besitzt, manche haben schon Funktionen wie „Ist Null“ oder „Ist definiert“.

„Eingebaute“ Gültigkeitsprüfung per Bereich (z.B. Zahl der Kinder [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke für die Antworten,

ich werde den Vorschlag von Semjon einbringen, da ich das schon angedacht hatte, nur das Template mir unbekannt war.

Das Entwerfen eines Objektes dafür ist natürlich die elegantere Lösung, das Problem ist, dass an einer Stelle dann sowieso die Konvertierung stattfinden muss. Und das ist einfacher, wenn man über eine get-Methode den Rückgabewert NULL oder Nicht-NULL erhält.

Einen Wert für die Zuweisung zu verbrauchen sagt mir auch nicht zu, da der Fall, dass dieser dann irgendwie doch mal verwendet werden soll eintreten kann.

Aber wie schon erwähnt gibt es ja die Variant-Datentypen und in .NET werden die auch richtig gut, aber da das nicht verwenden kann und Speicherplatz ausnahmsweise bei mir wirklich ein Thema ist, ist das Bitset geeignet.

Danke!