Mirki i Mirabelki z #wroclaw, którzy interesują się #cpp, ze szczególnym uwzględnieniem #cpp11, #cpp14 i #cpp17 - będę prowadził mini kurs C++ ze złożoności obliczeniowej i biblioteki STL. Jeśli chcecie poszerzyć waszą znajomość C++, bo np. chcielibyście pracować jako programiści C++ to gorąco zachęcam. Tylko 3 lekcje po 5 godzin + prace domowe i projekt (opcjonalnie). Nielimitowane konsultacje online.
LordLukin - Mirki i Mirabelki z #wroclaw, którzy interesują się #cpp, ze szczególnym ...

źródło: comment_3M4SXCfoNQcZM0UefSrxObn9EaC7Koih.jpg

Pobierz
Mam klasę abstrakcyjną Blob z funkcjami wirtualnymi Blob::fromArray(const QByteArray& raw) i Blob::toByteArray()->QByteArray. Weźmy jej klasę pochodną, Matrix; przeciążyłem operatory QDataStream w taki sposób:

QDataStream& operator<<(QDataStream& stream, const Matrix& in) {
stream << in.toArray();
}
QDataStream& operator>>(QDataStream& stream, Matrix& out) {
Mam taką sytuację (bez strachu, kilka linijek tam jest i proste ale na Wykopie mało przejrzyście): http://pastebin.com/U5B9NTd1

No i teraz:
1) Czy usunięcie MyClassB spowoduje wywołanie tak destruktora MyClassB, jak i MyClass czy muszę się jakoś odwołać z destruktora MyClassB do MyClass, np. funkcją MyClass::del() w każdym z destruktorów?
2) Czy usunięcie MyClassA spowoduje wywołanie destruktora MyClass, czy też muszę uczynić destruktor MyClass wirtualnym żebym to się stało?

#cpp #
@lionbest: ten void* to tam sobie dodałem tak tylko dla przykładu. zresztą, delete na staticcast(this->voidptr) już ma sens. ale dziękuję za odpowiedź. :)
  • Odpowiedz
@Dijuna: Generalnie to tak jak masz napisane to powinieneś mieć virtual przy destruktorze, żeby działało zawsze (w MyClass). Dopóki nie pokażesz więcej kodu trudno powiedzieć co się stanie.
  • Odpowiedz
Clang ma rację, a GCC generuje Ci funkcje, które nie są constexpr. Po prostu źle zrozumiałeś standard:

A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions (...) a reinterpretcast.


Czyli wyrażenie jest constexpr, chyba że zawiera reinterpretcasta (lub jeden z kilku innych konstruktów).
  • Odpowiedz
Czesc,

chcialem napisac sobie funkcje compile-time, ktora zsumuje mi sizeof kazdego elementu w std::tuple, kod wyglada tak:
http://ideone.com/yNH8S3

dziala. Niby. Chcialem dodac sobie constraint za pomoca enable_if tak aby liczone to bylo tylko dla typow POD. Pozniej chce zrobic druga wersje dla mojego specjalnego typu, ew. wymagac, zeby klasy non-POD mialy metode size(). Tutaj cos mi sie wywala i kompilator na mnie krzyczy. Za cholere nie moge dojsc o co mu chodzi. (nie jestem master w metaprogramowaniu wiec pytam tu)
Mirki, znam dość dobrze C++, jednak widzę że język się zmienia, nowe wersje, inne sposoby, a ja znam tylko część z nich. Szukam więc jakiejś książki która opisuje najnowsze wersje C++. Nie chcę nic dla laika, żadnej nauki deklaracji zmiennych czy tłumaczenia polimorfizmu. Chcę być na bieżąco, pisać lepiej i szybciej. Możecie coś polecić? Co sądzicie np. o tej książce: http://www.empik.com/skuteczny-nowoczesny-c-meyers-scott,p1103920923,ksiazka-p ?

#cpp #cpp11 #cpp14
@frogi16: Świetna książka, mogę polecić. Głównie opiera się na porównaniu nowych elementów ze starymi i opisaniu, dlaczego są lepsze. Jeśli chcesz pisać lepiej, szybciej i "nowocześnie", spróbuj znaleźć jakiś problem (np. jakiś czas temu na matematyka.pl pomagałem jednemu z listą: http://www.matematyka.pl/392980.htm ) i rozwiązać go za pomocą najnowszych metod z C++. Przez samo przeczytanie nie zawsze da się wyłapać, co naprawdę C++11/14 zmienia czy też przed czym chroni.

Sam bardzo
  • Odpowiedz
@Djuna: @michak: ale tu ekspertów xd
rzeczywiście, ptr jest w tym przypadku kopią wskaźnika. Natomiast działa to w połowie tak jak chcesz - tworzona jest kopia wskaźnika ptr, zwalniana jest pamięc pod tą kopią (równocześnie pod oryginałem - przecież wskazują na ten sam obszar pamięci. Poźniej przypisujesz NULLa do kopii, nie do oryginału. Jeśli chcesz również przypisać NULLa do oryginału, to musisz zrobić tak jak napisałeś - referencje
  • Odpowiedz
Wlasnie przeczytalem fajny artykul odnosnie Aspect oriented programming (nie chce spojlerowac teraz, pozniej wkleje link) w ktorym natknalem sie na bardzo ciekawy kod.

Jak sadzicie co robi ponizsza funkcja ?

template
void foo(F f, A&&... args) {
No nie wiem. Napieprzanie makrami, zewnętrzne narzędzia do prekompilacji kodu = kolejne zaleƶności (w uƶyciu jest sed, ciekawe czy testy na windows wypadły pomyślnie). Do tego stwierdzenia wyraźnie nieprawdziwe w readme, np:

Without symbols (or other similar constructs), it is not possible to write such a generic print_member function. Without, one would have to write the three version accessing the three different members.
  • Odpowiedz
Okej, ale dlaczego uważasz, że akurat kod C++11 ma nie mieć ifdefów?


@vipe: Ja tak nie uwaƶam, ja napisałem, ƶe kod w bibliotekach typu Qt/Boost (i ogółem kod, który ma się kompilować zarówno w C++03 jak i w C++11 - i brać z tego korzyści) musi być usiany ifdefami.

kiedy można powiedzieć że projekt jest C++11
  • Odpowiedz