Byla vydána nová verze 0.4.15 (𝕏) svobodného operačního systému ReactOS (Wikipedie), jehož cílem je kompletní binární kompatibilita s aplikacemi a ovladači pro Windows. Přehled novinek i s náhledy v oznámení o vydání.
Byl představen rpi-image-gen, tj. oficiální nástroj pro vytváření vlastních softwarových obrazů pro zařízení Raspberry Pi.
Byla vydána nová major verze 8.0, aktuálně 8.0.1, softwaru pro správu elektronických knih Calibre (Wikipedie). Přehled novinek v poznámkách k vydání. Vypíchnuta je lepší podpora Kobo KEPUB formátu nebo integrovaný lokálně běžící engine Piper pro převod textu na řeč používaný pro čtení nahlas (již od verze 7.18).
Společnost OpenAI rozšířila své API o nové audio modely. Nový model pro převod textu na řeč (text-to-speech model) lze bez přihlašování vyzkoušet na stránce OpenAI.fm.
Příspěvek Bezpečnost paměti pro webové fonty na blogu Chrome pro vývojáře rozebírá, proč se pro zpracování webových fontů v Chrome místo FreeType nově používá v Rustu napsaná Skrifa z Fontations.
V pátek 21. a v sobotu 22. března proběhnou Arduino Days 2025, tj. každoroční „narozeninová oslava“ platformy Arduino. Na programu je řada zajímavých přednášek. Sledovat je bude možné na YouTube. Zúčastnit se lze i lokálních akcí. V sobotu v Praze na Matfyzu.
Komunitná konferencia Bratislava OpenCamp, ktorá sa uskutoční už o tri týždne 5. 4. 2025 na FIIT STU pozná svoj program – návštevníkom ponúkne 3 paralelné behy prednášok a workshopov na rôzne témy týkajúce sa otvoreného softvéru či otvorených technológií.
Časopis MagPi od nakladatelství Raspberry Pi se s číslem 151 přejmenoval na Raspberry Pi Official Magazine. I pod novým názvem zůstává nadále ve formátu pdf zdarma ke čtení.
Japonská SoftBank Group kupuje firmu Ampere Computing za 6,5 miliardy dolarů. Ampere Computing vyrábí 32-128jádrové procesory Ampere Altra a 192jádrové procesory AmpereOne.
Byla vydána (𝕏) nová verze 2025.1a linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek v oficiálním oznámení na blogu.
#include <string> #include <iostream> class Base { public: std::string x; int y; Base(std::string x_, int y_): x(x_), y(y_) {} Base(Base &&b): x(std::move(b.x)), y(b.y) {} virtual ~Base() {} virtual void do_something() = 0; virtual void turn_to_a() {} }; class B; class A: public Base { public: A(B &&b); A(std::string x_, int y_): Base(x_, y_) {} void do_something() override { std::cout << "I am 'A'. x = " << x << ", y = " << y << "\n"; } }; class B: public Base { public: B(std::string x_, int y_): Base(x_, y_) {} void do_something() override { std::cout << "I am 'B'. x = " << x << ", y = " << y << "\n"; } void turn_to_a() override { static_assert(sizeof(A) == sizeof(B), "must be the same size"); B tmp(std::move(*this)); this->B::~B(); new (this) A(std::move(tmp)); } }; A::A(B &&b): Base(std::move(b)) {} int main() { Base *b = new B("life, universe and everything", 42); b->do_something(); b->turn_to_a(); b->do_something(); delete b; }
Řešení dotazu:
union
?
bool is_a;
. A potom v kazdy metode testoval jestli je flag nastaveny, ale prijde me ze mit to oddeleny je o neco cistsi.
Dejme tomu ze mam 2 tridy - A a B. Obe dedi z tridy Base. Nepridavaji zadne promenne, jen predefinuji virtualni funkce. Program nacita data a vetsinou z nich chce vytvorit tridu B. Obcas ale A a problem je ze tuto informaci se dozvi az pozdeji. Kdyz se dozvi ze vlastne potrebuje A tak nechci aby musel alokovat novou pamet, ani aby musel zpetne menit pointery ktere uz ukazuji na B.Začalo to hezky, skoro jako v pohádce: Žily byly dvě sestry, jedna staříkova, druhá stařenčina ... ... ale zápletka na sebe nenechala dlouho čekat. Pokud program chce "většinou" vytvořit třídu B, ale někdy později ji chce vyměnit za A, tak najednou se po nás chce zajistit dynamické chování ve statickém světě dědičnosti tříd. Prostě z jezevčíka mávnutím kouzelné hůlky udělat dobrmana. Vždyť je to přeci také pes. Použití operátoru new s umístěním je ale stejné jako nahánění jezevčíka s chirurgickým skalpelem v ruce. Když se na to podívám z druhé strany, tak vlastně nepotřebuji předělávat jezevčíka na dobrmana, ale chci jen naučit psa kousat jako dobrman, aby mi nikdo nechodil po dvorku. Pokud nejsem psí zubař, tak mohu tedy skalpel s klidem zahodit
#include <iostream> enum StrategyType { A, B }; class Strategy { protected: std::string* x; int* y; public: void setOptions(std::string* _x, int* _y) { x = _x; y = _y; } virtual void doSomething() = 0; }; class StrategyA : public Strategy { virtual void doSomething() { std::cout << "I am 'A'. x = " << *x << ", y = " << *y << std::endl; } }; class StrategyB : public Strategy { virtual void doSomething() { std::cout << "I am 'B'. x = " << *x << ", y = " << *y << std::endl; } }; class Base { private: std::string x; int y; Strategy* strategy; public: Base(std::string x_, int y_): x(x_), y(y_), strategy(NULL) {} ~Base() { delete strategy; } void doSomething() { strategy->doSomething(); } void setStrategy(StrategyType type) { if (strategy) delete strategy; if (type == A) strategy = new StrategyA(); else if (type == B) strategy = new StrategyB(); strategy->setOptions(&x, &y); } }; int main() { Base base("life, universe and everything", 42); base.setStrategy(B); base.doSomething(); // ... base.setStrategy(A); base.doSomething(); return 0; }Oproti zadání je možné měnit strategie nejen z B na A, ale i zpět a navíc opakovaně.
template<typename T> class Wrap { public: T* new_() { return new(this) T();} void delete_() { ((T*)this)->~T(); } unsigned char data[sizeof(T)]; }; class Base { public: Base() {} virtual ~Base() {} virtual int getType() const = 0; int a; int b; }; class A : public Base { public: A() {} virtual ~A() {} virtual int getType() const { return 1; } }; class B : public Base { public: B() {} virtual ~B() {} virtual int getType() const { return 2; } }; union Union { template<typename T> T* as() { return (T*)this; } Wrap<A> a; Wrap<B> b; }; int main(int argc, char* argv[]) { Union u; u.a.new_(); printf("%d\n", u.as<Base>()->getType()); u.a.delete_(); u.b.new_(); printf("%d\n", u.as<Base>()->getType()); u.b.delete_(); return 0; }
Tiskni
Sdílej: