Професионална програма
Loading...
bonev_st avatar bonev_st 11 Точки

Github repository

Здравейте,

Тук

https://github.com/bonev-st/AppDevCpp2021

съм качил нещата които сме правили до момента, ако на някой му е интересно :).

Естесвено кода не съвсем същия като Живко.

Тагове:
2
C++ Applications Development
j.petrov_90 avatar j.petrov_90 370 Точки

Здравей, колега,

Адмирации за добрата работа.
Забелязвам С background с добавка модерен C++ twist :)
Познах ли?

Харесва ми, че си усвоил знанията и си ги приложил от твоята гледна точка.
Допада ми и факта, че си wrap-нал Surface/Textures's в smart pointer-и.
Доста се чудех по този въпрос докато разработвах курса, но реших да не задълбавам в тази насока.
И без това смятам, че първите занятия имаха стръмен learning curve за хора с по-малко опит.
Смарт пойнтърите щяха да им дойдат в повече.

Няколко неща, които забелязах и искам да изкоментирам:
1) Няма нужда на пишеш конструктори и десктруктури = default, когато нямаш други упоменати такива.
Това си е излишен boilerplate. Компилаторът ще ги генерира за теб.
Даже бих казал, че е "лошо", защото default generated dctor е маркиран като noexcept.

2) Не е нужно да правиш typedef на структури.

typedef struct _Texture_t {
    std::shared_ptr<SDL_Texture> m_Texture;
    int32_t m_W;
    int32_t m_H;
} Texture_t;

Може да бъде просто:

struct Texture_t {
    std::shared_ptr<SDL_Texture> m_Texture;
    int32_t m_W;
    int32_t m_H;
};


3) Готина имплементация на NoCopy.hpp

class NoCopy {
	NoCopy(const NoCopy &) = delete;
	NoCopy(NoCopy &&) = delete;
	NoCopy operator = (const NoCopy &) = delete;
	NoCopy operator = (NoCopy &&) = delete;
public:
	NoCopy() = default;
    ~NoCopy() = default;
};

Точно за нещо подобно си говорих с един колега онзи ден.

Нещото, което ми прави впечатление е, че същината (copy & move) ctor/assignment operators са ти private.
Реално това е the C++98 way. Той също е верен, но не вади толкова смислен compiler error.
По-добре е да ги оставиш публични за да може да влезе в роля ключовата дума delete, която ще даде по-описателна грешка.

Поздрави

1
17/10/2021 13:47:19
bonev_st avatar bonev_st 11 Точки

Благодаря за коментарите.

 От доста годи работя като "deep embedded" (малки контроллери с по няколко КБ рам и ром, baremetal или с RTOS) програмист, от начало на асблер после на C, a през последните години пиша предимно на C++.

1
j.petrov_90 avatar j.petrov_90 370 Точки

Разбрах аз :)
В момента, в който видях двойно отрицание върху побитова маска всичко беше ясно :)

Продължавай в същия дух.
Само напред и нагоре.

1
Smeshan avatar Smeshan 89 Точки

Здравейте,
за какво служи NoCopy.hpp?
И кога е редно да е .hpp, а не .h :?

Поздрави

0
j.petrov_90 avatar j.petrov_90 370 Точки

Привет,

 

Няма правило за .h <-> .hpp

Въпрос на конвенция.

 

В случая Станимир си е имплементирал NoCopy помощен клас.

Когато наследи този клас в някой друг клас автоматично наследява и забраната за copy/move.

 

Това би му спестило писането на boilerplate-а всеки път да delete-ва всичко за различните класове.

 

Поздрави

1
17/10/2021 23:17:58
bonev_st avatar bonev_st 11 Точки

Като цяло няма значение дали е *.h или *.hpp, но на мен повече ми харсва h - да сa хедърите на C, a hpp да се хедърите на C++, NoCopy,hpp е базов клас който, ако се наследи, насленика не може да бъде копиран.

1
18/10/2021 20:25:41