Moje preferencje:
class JakasKlasa
: public Rodzic1 // najpierw klasy zwykłe
, public Rodzic2
, public Interface1 // potem interfejsy
, public Interface2
, public std::enable_shared_from_this<JakasKlasa> // jeśli jest to ostatnia klasa w hierarchii i zarządzana jest przez std::shared_ptr
// moje ulubione "udziwnienie" widać powyżej, przecinki i dwukropek są na początku a nie na końcu linii!
// zalety są dwie:
// po dopisaniu na końcu nowego dziedziczenia nie ma konfliktów w merge albo są do naprawienia jednym klikiem
// optycznie widać lepiej sekwencję dziedziczenia
// tak samo wygląda u mnie lista inicjalizacyjna - podobne zalety ale się częściej objawiają
{
public:
struct Struct //typy wewnętrzne
{
};
using JakisTyp = std::function<void(int, const std::string&);
public:
~JakasKlasa(); // preferuje deklarację destrura jako pierwszą i piszę ją zawsze nawet jak jest pusty, żeby przyspieszyć proces budowania
JakasKlasa();
explicit JakasKlasa(int x); // domyślnie dopisuje explicit potem się zastanawiam, czy nie lepiej usunąć
void publiczneMeotody();
public: // metody statyczne też wolę pod własnym "public"
static std::shared_ptr<Interface1> makeSome();
public: /* Interface1 */ // celowe powtórnie public
void metodaZInterfejsu1();
public: /* Interface2 */
void metodaZInterfejsu2();
void metoda2ZInterfejsu2();
protected:
void metodaChroniona()
private:
void meodaPrywatna();
private:
int pole; // wszystkie pola na samym dole, grupki oddzielone pustymi liniami jeśli to potrzebne.
};
Przy czym:
- pola tylko prywatne (chyba, że jest to "value object"/"typ strukturalny," który nigdy nie ma metod wirtualnych)
- nigdy nie używam przyjaźni, zawsze mi ją ładnie rozwiązuje jakaś pomocnicza metoda publiczna.
- definicje operatorów zawsze są jednolinijkowymi inline'ami wywołującymi jakąś metodę publiczną, np:
inline MojTyp operator+(const MojTyp& b) const
{
return add(b);
}
I jeszcze oczywiście coś takiego: https://4programmers.net/Forum/C_i_C++/137960-C++_Unikanie_include_w_plikach_naglowkowych?p=513176#id513176