Formatowanie kodu

0

Witam
Czy jak do funkcji przesyłam zmienna np.

 
void funk(const int &zmienna)
{

}

To powinienem zapisać to jako ZMIENNA czy zmienna. Nie mogłem znaleźć info na ten temat.

Probujac zmiescic kod w 80 znakach czas dziwne twory wychdza, czy takie cos jest poprawne?


Przedmiot::Przedmiot(string nazwa_, string rodzaj_, int atakMagiczny_,
                         int atakFizyczny_, int obronaMagiczna_,
                             int obronaFizyczna_, int minPoziom_,
                                 int cenaKupna_)
    : _nazwa(nazwa_), _rodzaj(rodzaj_), _atakMagiczny(atakMagiczny_),
          _atakFizyczny(atakFizyczny_), _obronaMagiczna(obronaMagiczna_),
              _obronaFizyczna(obronaFizyczna_), _minPoziom(minPoziom_),
                  _cenaKupna(cenaKupna_),
                      _cenaSprzedazy(_cenaKupna * _strataWartosci)
{ }

 
1

To jak bedziesz nazywal swoje zmienne/funkcje/parametry/klasy itd jest tylko konwencja i dopoki bedziesz sie trzymal zawsze jednej ustalonej przez siebie konwencji to bedzie dobrze.

Ogolnie sa rozne rozne "standardy" typu notacja wegierska ale nie ma obowiazku sie ich trzymac. Czesto wieksze projekty czy firmy tworzace oprogramowanie maja szczegolowo zdefiniowane wlasne standardy nazewnictwa, ktore sa wspolne dla calego projektu czy nawet grupy projektow.

1

Ja problem za długich linijek rozwiązałbym tak:

Przedmiot::Przedmiot (string nazwa_, 
                      string rodzaj_, 
                      int atakMagiczny,
                      int atakFizyczny_,
                      int obronaMagiczna_,
                      int obronaFizyczna_,
                      int minPoziom_,
                      int cenaKupna_)
                            : _nazwa(nazwa_), 
                              _rodzaj(rodzaj_),
                              _atakMagiczny(atakMagiczny_),
                              _atakFizyczny(atakFizyczny_),
                              _obronaMagiczna(obronaMagiczna_),
                              _obronaFizyczna(obronaFizyczna_),
                              _minPoziom(minPoziom_),
                              _cenaKupna(cenaKupna_),
                              _cenaSprzedazy(_cenaKupna * _strataWartosci)
{ }

Co do nazewnictwa zmiennych to najważniejsza jest konsekwencja.

1

ja bym zrobił tak:

Przedmiot::Przedmiot(const string &nazwa, const string &rodzaj, 
                     int atakMagiczny, int atakFizyczny,
                     int obronaMagiczna, int obronaFizyczna,
                     int minPoziom, int cenaKupna)
    : nazwa(nazwa)
    , rodzaj(rodzaj)
    , atakMagiczny(atakMagiczny)
    , atakFizyczny(atakFizyczny)
    , obronaMagiczna(obronaMagiczna)
    , obronaFizyczna(obronaFizyczna)
    , minPoziom(minPoziom)
    , cenaKupna(cenaKupna)
    , cenaSprzedazy(cenaKupna * strataWartosci)
{}

uwagi:

  • stringi przez const string&
  • podział parametrów mniej-więcej powiązany z ich znaczeniem (stąd atakMagiczny i atakFizyczny w jednej linijce)
  • nie trzeba tych wszystkich podkreśleń. niby wprowadza to niejasność czy chodzi o parametr czy o pole klasy, ale w tym miejscu to bez znaczenia. jeśli już musisz, to daj _ albo w polach albo w parametrach, a nie obu.
  • te fikuśne przecinki to dla estetyki. gdy ciało konstruktora nie jest puste, fajnie wyróżnia listę inicjalizacyjną.

PS. co to niby jest strataWartosci? :-)

2

Przy tak dużej ilości parametrów to bym to wrzucił tworzenie obiektów do osobnej klasy budowniczego i wywoływał kolejne atrybuty po kolei. Skąd przy wywołaniu konstruktora będziesz wiedział, czy podajesz atak fizyczny, czy atak magiczny (no dobra, IDE podpowiada, ale w tym przypadku taka ilość parametrów to zły kod)? Konwencje są różne, najważniejsza jest konsekwentność. Jak jej nie ma to potem kod czyta się jak ten: ftp://iole.swmed.edu/pub/al2co/al2co.c (są tam też przykłady konwencji zupełnie nieczytelnych).

0
#ifndef __PRZEDMIOT_H__
#define __PRZEDMIOT_H__

#include <string>
#include <iostream>

using namespace std;

class Przedmiot
{
public:
    //--Konstruktory
    Przedmiot(string nazwa_, string rodzaj_, int atakMagiczny_,
                  int atakFizyczny_, int obronaMagiczna_, int obronaFizyczna_,
                      int minPoziom_, int cenaKupna_);
    Przedmiot();
    //--Metody Dostepowe
    const string &nazwa() const {return _nazwa;}
    const string &rodzaj() const {return _rodzaj;}
    const int &atakMagiczny() const {return _atakMagiczny;}
    const int &atakFizyczny() const {return _atakFizyczny;}
    const int &obronaMagiczna() const {return _obronaMagiczna;}
    const int &obronaFizyczna() const {return _obronaFizyczna;}
    const int &minPoziom() const {return _minPoziom;}
    const int &cenaKupna() const {return _cenaKupna;}
    const int &cenaSprzedazy() const {return _cenaSprzedazy;}
    const int strataWartosci() const {return _strataWartosci;}

private:
    string _nazwa;
    string _rodzaj; //np. helm, tarcza, bron, buty
    int _atakMagiczny;
    int _atakFizyczny;
    int _obronaMagiczna;
    int _obronaFizyczna;
    int _minPoziom;
    int _cenaKupna;
    int _cenaSprzedazy;
    float _strataWartosci = 0.6; // nie da sie zrobic const
};
//--
ostream &operator<<(ostream &out, const Przedmiot &p);
#endif
 

Jeżeli chodzi o nazewnictwo, to chce być konsekwentny. Dlatego pytam która wersja jest lepsza.

Wie ktos moze dlaczego nie moge zrobić? Cale IDE się wysypuje (Code::Blocks).

const float _strataWartosci = 0.6;

Oraz dlaczego _strataWartosci jest uznawana jako obiekt tymczasowy? Przez co musiałem zrobić metodę dostępowa bez zwracania referencji. Jak zmieniam float na int, tego ostrzeżenia nie ma.

Wasze wersje konstruktorów o niebo czytelniejsze. Teraz własnie tak zacznę je robić.

Co mi da przesłanie string przez const string &?

1

Przesyłanie przez const string& da to, że napis nie będzie kopiowany - oszczędność czasu i miejsca.

Nie można przypisywać wartości w definicji klasy, musisz poza klasą zrobić(tylko z int'em to przechodzi):

float Przedmiot::_strataWartosci = 0.6f;
0

Biorąc pod uwagę to jak często jest zalecane pisanie zmiennych const dużymi literami, nie widzę przeszkód by tez tu tak to zapisywać.

Ma ktoś pomysł odnośnie tego float ? Dlaczego float i double traktuje mi jako obiekt tymczasowy?

0

Jaki obiekt tymczasowy? o_O Pokaż kod, który obrazuje problem

0

Problem rozwiązany, zrobiłem banalny błąd. Zamiast float zwracałem int w metodzie dostępowej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1