En C ++, les initialiseurs de style C ont été remplacés par des constructeurs qui, au moment de la compilation, peuvent garantir que seules les initialisations valides sont effectuées (c'est-à-dire qu'après l'initialisation, les membres de l'objet sont cohérents).
C'est une bonne pratique, mais parfois une pré-initialisation est pratique, comme dans votre exemple. La POO résout ce problème par des classes abstraites ou des modèles de conception créatifs .
À mon avis, l'utilisation de cette méthode sécurisée tue la simplicité et parfois le compromis de sécurité peut être trop cher, car un code simple n'a pas besoin d'une conception sophistiquée pour rester maintenable.
Comme solution alternative, je suggère de définir des macros en utilisant des lambdas pour simplifier l'initialisation pour ressembler presque au style C:
struct address {
int street_no;
const char *street_name;
const char *city;
const char *prov;
const char *postal_code;
};
#define ADDRESS_OPEN [] { address _={};
#define ADDRESS_CLOSE ; return _; }()
#define ADDRESS(x) ADDRESS_OPEN x ADDRESS_CLOSE
La macro ADDRESS se développe pour
[] { address _={}; /* definition... */ ; return _; }()
qui crée et appelle le lambda. Les paramètres de macro sont également séparés par des virgules, vous devez donc mettre l'initialiseur entre crochets et appeler comme
address temp_address = ADDRESS(( _.city = "Hamilton", _.prov = "Ontario" ));
Vous pouvez également écrire un initialiseur de macro généralisé
#define INIT_OPEN(type) [] { type _={};
#define INIT_CLOSE ; return _; }()
#define INIT(type,x) INIT_OPEN(type) x INIT_CLOSE
mais alors l'appel est un peu moins beau
address temp_address = INIT(address,( _.city = "Hamilton", _.prov = "Ontario" ));
cependant, vous pouvez définir la macro ADRESSE à l'aide de la macro générale INIT facilement
#define ADDRESS(x) INIT(address,x)