Navigace se soukromím CoMaps postavena nad OpenStreetMap je nově k dispozici v Google Play, App Store i F-Droid. Jedná se o komunitní fork aplikace Organic Maps.
Vývojáři OpenMW (Wikipedie) oznámili vydání verze 0.49.0 této svobodné implementace enginu pro hru The Elder Scrolls III: Morrowind. Přehled novinek i s náhledy obrazovek v oznámení o vydání.
Masivní výpadek elektrického proudu zasáhl velkou část České republiky. Hasiči vyjížděli k většímu počtu lidí uvězněných ve výtazích. Výpadek se týkal zejména severozápadu republiky, dotkl se také Prahy, Středočeského nebo Královéhradeckého kraje. Ochromen byl provoz pražské MHD, linky metra se už podařilo obnovit. Výpadek proudu postihl osm rozvoden přenosové soustavy, pět z nich je nyní opět v provozu. Příčina problémů je však stále neznámá. Po 16. hodině zasedne Ústřední krizový štáb.
Po více než roce vývoje od vydání verze 5.40 byla vydána nová stabilní verze 5.42 programovacího jazyka Perl (Wikipedie). Do vývoje se zapojilo 64 vývojářů. Změněno bylo přibližně 280 tisíc řádků v 1 500 souborech. Přehled novinek a změn v podrobném seznamu.
Byla vydána nová stabilní verze 7.5 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 138. Přehled novinek i s náhledy v příspěvku na blogu.
Sniffnet je multiplatformní aplikace pro sledování internetového provozu. Ke stažení pro Windows, macOS i Linux. Jedná se o open source software. Zdrojové kódy v programovacím jazyce Rust jsou k dispozici na GitHubu. Vývoj je finančně podporován NLnet Foundation.
Byl vydán Debian Installer Trixie RC 2, tj. druhá RC verze instalátoru Debianu 13 s kódovým názvem Trixie.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za červen (YouTube).
Libreboot (Wikipedie) – svobodný firmware nahrazující proprietární BIOSy, distribuce Corebootu s pravidly pro proprietární bloby – byl vydán ve verzi 25.06 "Luminous Lemon". Přidána byla podpora desek Acer Q45T-AM a Dell Precision T1700 SFF a MT. Současně byl ve verzi 25.06 "Onerous Olive" vydán také Canoeboot, tj. fork Librebootu s ještě přísnějšími pravidly.
Licence GNU GPLv3 o víkendu oslavila 18 let. Oficiálně vyšla 29. června 2007. Při té příležitosti Richard E. Fontana a Bradley M. Kuhn restartovali, oživili a znovu spustili projekt Copyleft-Next s cílem prodiskutovat a navrhnout novou licenci.
#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: