1 - Ty zkopírované instance nejsou a nemohou být konstantní a uživatelský kód se v nich může libovolně vrtat.
2 - Porušují data hiding, interní proměnná myInt je zvenku viditelná a přístupná.
3 - Nelze tam realizovat polymorfismus. Všimněte si, že moje funkce initialize() může ty function pointery nastavit na jakoukoliv funkci z té knihovny.
1) Zkopírované instance ani nemají být konstantní, konstantní má být jenom ta výchozí instance, aby v ní někdo nemohl přepsat např. ty metody
2) Neporušují data hiding, proměnné a metody které mají být zvenku přístupné jsou v definici te struktury, to co nemá být zvenku viditelné je schované v .c implementaci.
3) No, dejme tomu, mě by to stačilo i bez toho polymorfizmu. Používáte tam malloc a to se mi nelíbí, proč malloc když to může být inicializováno staticky?
Já oproti tomu jako hlavní problém toho mého řešení vidím v tom, že nastane problém v momentě, kdy bych potřeboval ve struktuře mít cokoliv inicializováno dynamicky. V ten moment bych nemohl udělat deep copy. Takže bych se neobešel bez metod
struct library create_library_instance();
void delete_library_instance();
Ale ty bych použil jen v případě, kdyby probíhala nějaká dynamická alokace, jinak by to totiž bylo useless.