Kolejność deklaracji składowych w klasie

Kolejność deklaracji składowych w klasie
M9
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 miesięcy
  • Postów:78
0

W jakiej kolejności deklarujecie składowe klasy aby zachować przejrzystość kodu? Chodzi mi o to aby rozgraniczyć na konstruktory, destruktory, metody, metody wirtualne, struktury, zmienne oraz składowe publiczne, chronione i prywatne? Czy tak jak poniżej jest ok:

Kopiuj

class MyClass {
private:
	struct MyStruct1 {};
protected:
	struct MyStruct2 {};
public:
	struct MyStruct3 {};
private:
	MyStruct1 st1;
	int var1;
protected:
	MyStruct1 st2;
	int var2;
public:
	MyStruct1 st3;
	int var3;
public:
	MyClass();
	MyClass(int);
	~MyClass();
private:
	void method1();
	virtual void method4() = 0;
protected:
	void method2();
	virtual void method5() = 0;
public:
	void method3();
	virtual void method6() = 0;

};
edytowany 2x, ostatnio: mlp99
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
0

Tak, żeby był ładny alignment :P


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Szczecin
2

Cały post to opinia.

Jak dla mnie takie spagetti jest szalenie nieczytelne. Osobiście preferuję po prostu podział na sekcje public (góra), protected (środek) i private (dół). Jeśli są jakieś dodatkowe (np. public slots w Qt), to są pod daną sekcją, czyli public slots by było między public a protected.

Wyjątkiem jest celowe ustawienie jakichś alignmentów/kolejności elementów, ale to się raczej zdarza na niskim poziomie przy POD-ach, gdzie wszystko jest public i tak.


edytowany 1x, ostatnio: kq
M9
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 miesięcy
  • Postów:78
0

@kq Ale wówczas pod poszczególnymi modyfikatorami w jaki sposób porządkujesz składowe? Mógłbyś proszę podać jakiś przykład? Za każdym razem kiedy tworzę klasę mam problem jak posegregować zmienne aby zachować porządek i nie mogę wypracować jakiegoś przejrzystego stylu.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Szczecin
0

Pierw funkcje, potem zmienne. Jeśli definiuję enumy/typy to są one na górze, o ile nie dotyczą wyłącznie jednej funkcji/zmiennej, wtedy są blisko niej.

Przy czym nie pamiętam żebym w ciągu ostatnich lat miał obiekt w public/protected, tylko funkcje. W sumie protected prawie nie używam również.


MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:5 dni
  • Lokalizacja:Warszawa
  • Postów:1454
1

Ja stosuję taki zapis klas

Kopiuj
class SomeClass
{
public:
    SomeClass();//najpierw domyślny konstruktor...
    SomeClass(int parameter);//potem reszta konstruktorów
    ~SomeClass();//na końcu destruktor
//jeden \n odstępu
   int penSize;//składniki publiczne, jeśli są, grupowane względem powiązania logicznego
   QColor penColor;
//jeden \n odstępu pomiędzy poszczególnymi grupami logicznymi
   int margin;
   int border
//jeden \n odstępu separujący składniki od metod
   void setupPen();//które też są pogrupowane według wspólnej logiki/zagadnienia jakiego dotyczą

   void setupViewportBox(int margin, int border);//nastawianie obramowania viewportu nie jest logicznie powiązane z inicjacją pióra, stąd odstęp pomiędzy metodami

//powyższe przewija się też w sekcjach protected i private
protected:
private:
};

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:9 minut
1

Moje preferencje:

Kopiuj
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:
Kopiuj
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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 18 godzin
0
MarekR22 napisał(a):
Kopiuj
class JakasKlasa
   : public Rodzic1
   , public Rodzic2
   , public Interface1
   , public Interface2

moje ulubione "udziwnienie" widać powyżej, przecinki i dwukropek są na początku a nie na końcu linii!

To też najbardziej sensowny sposób formatowania listy inicjalizacyjnej.

edytowany 3x, ostatnio: Azarien
MasterBLB
To nie lista inicjalizacyjna, ale dziedziczenia. Fakt jednak faktem, w przypadku dziedziczenia na raz wielu klas poprawia czytelność. Dla 2, góra 3 to wolałbym klasyczny zapis class SomeClass : public Parent1, public Parent2, public Parent3
Azarien
Dlatego dodałem słowo „też”.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)