Wie initialisiere ich Strukturen mithilfe von Feldnamen?
Posted: 18 Jan 2025, 20:24
Ich möchte viele verschiedene Objekte eines Typs (einer Struktur) mit unterschiedlichen Werten für ihre Felder initialisieren und ich möchte Namen für die Initialisierung verwenden, um den Code lesbar und robust zu machen.
Initialisatorlisten Denn Strukturen haben zwei tödliche Nachteile:
Betrachten wir den Code (bitte bleiben Sie nicht bei dem konkreten Beispiel hängen, die Farben der Benutzeroberfläche dienen hier nur der Einfachheit des Beispiels):
params.h
params.cpp
application.cpp
Initialisatorlisten Denn Strukturen haben zwei tödliche Nachteile:
- Sie sind namenlos; Wenn ich ein Dutzend Parameter desselben Typs (Farben von UI-Elementen) habe, kann es leicht passieren, dass sie durcheinander geraten. Es ist schwer zu erkennen, was jeder von ihnen bedeutet, und Kommentare helfen nicht weiter und könnten aufgrund von (2) sogar irreführen.
- Die Reihenfolge der Strukturfelder ist ein festgelegter Vertrag (oder eine API oder eine Schnittstelle). ); Wenn ein Entwickler morgen die Reihenfolge der Felder ändert (bessere Speicheranpassung, häufigere Verwendung, alphabetische Reihenfolge usw.), werden alle Initialisiererlisten mit Werten desselben Typs in unvorhersehbarer Entfernung zerstört. Starke Stellen im Code, die ziemlich schwer zu finden sind, selbst wenn man merkt, was passiert ist.
Betrachten wir den Code (bitte bleiben Sie nicht bei dem konkreten Beispiel hängen, die Farben der Benutzeroberfläche dienen hier nur der Einfachheit des Beispiels):
params.h
Code: Select all
struct RGB { unsigned char r=0, g=0, b=0; };
struct UIColors {
RGB background;
RGB font;
};
namespace params {
extern bool ui_bright_mode;
extern UIColors night_mode;
extern UIColors bright_mode;
}
Code: Select all
namespace params {
bool ui_bright_mode = 1;
UIColors night_mode = {
/*background*/ {1, 1, 1},
/*font*/ {0, 0, 200}
};
UIColors bright_mode = {
/*background*/ { 255, 255, 255 },
/*font*/ { 50, 50, 50 }
};
}
Code: Select all
#include
UIColors& ui_colors() {
return params::ui_bright_mode ? params::bright_mode : params::night_mode;
}
int main()
{
std::cout