Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Alternatywa dla const static

Ostatnio zmodyfikowano 2013-12-14 18:07
Autor Wiadomość
kubawal
Temat założony przez niniejszego użytkownika
Alternatywa dla const static
» 2013-12-13 17:13:19
Witam!

Przy porządkowaniu kodu znalazłem pewien (potencjalny) problem: w klasie mam stałe ustawienia, które reprezentuje np. tak
C/C++
class Klasa
{
public:
    class WindowSettings
    // 1 przykład
    {
    public:
        const static int windowH = //...
        //...
    };
   
    // lub też tak
   
    enum class PlayerSettings
        : int // c++11 // 2 przykład
    {
        initialHP = //...
        //...
    }

Jednak nie mogę w ten sposób definiować stałych o typie int.
W pierwszym przykładzie można ominąć ten problem przez deklarację w klasie, a definicje w source'u, jednak jest to bardzo brzydkie i długie
(w stylu
Color Game::WindowSettings::backgroundColor = Color::White;
), a poza tym zawsze muszę patrzeć 'gdzieś' do źródła, żeby zobaczyć, co ta stała reprezentuje.
Słyszałem, że podobno c++11 wprowadził możliwość definiowania w klasie stałych const-static nie tylko o typie int, ale u mnie (najnowszy GCC), to nie działa.
Zaznaczam, że nie chcę używać #define'ów, ponieważ te stałe musza być w określonym zakresie.

Czy istnieje jakaś alternatywa dla const static?
P-99109
Monika90
» 2013-12-13 17:25:38
Jednak nie mogę w ten sposób definiować stałych o typie int.
dlaczego nie? Ale kolejność ma być
static const int


Dla typów niecałkowitoliczbowych można uzyć constexpr
http:/​/coliru.stacked-crooked.com/a​/59b0427acdf2e124
P-99110
kubawal
Temat założony przez niniejszego użytkownika
» 2013-12-13 17:50:29
Jednak nie mogę w ten sposób definiować stałych o typie int.
dlaczego nie?

Sory, chciałem napisać, że nie mogę definiować stałych nie-int.
P-99112
kubawal
Temat założony przez niniejszego użytkownika
» 2013-12-14 11:07:01
Mam jeszcze jedno pytanie: Dlaczego za pomocą constexpr nie mogę definiować stałych o typie np. sf::Color?
Wywala mi wtedy masę błędów, że
C:\Biblioteki\SFML-src\include\SFML\Graphics\Color.hpp:40: note:   'sf::Color' is not an aggregate, does not have a trivial default constructor, and has no constexpr constructor that is not a copy or move constructor
O co mu chodzi?
P-99168
pekfos
» 2013-12-14 12:49:07
Nie możesz utworzyć stałej constexpr dla sf::Color, z, podanego przez kompilator, powodu. Tu możesz użyć tylko static const z definicją w pliku .cpp.

poza tym zawsze muszę patrzeć 'gdzieś' do źródła, żeby zobaczyć, co ta stała reprezentuje.
Komentarz?
P-99178
kubawal
Temat założony przez niniejszego użytkownika
» 2013-12-14 15:48:57
Ale o co chodzi z tym
trivial default constructor
 (trywialnym domyślnym konstruktorem?
P-99199
Monika90
» 2013-12-14 18:07:21
Dlaczego za pomocą constexpr nie mogę definiować stałych o typie np. sf::Color
Dlatego że biblioteka SFML nie jest przystosowana do C++11, klasa sf::Color powinna mieć konstruktor z atrybutem constexpr zdefiniowany w pliku nagłówkowym. Coś jak to
C/C++
struct Color
{
    int r, g, b, a;
    constexpr Color( int r, int g, int b, int a = 255 )
        : r( r )
        , g( g )
        , b( b )
        , a( a )
    { }
};

Być może da się obejść ten problem przez zdefiniowanie własnej klasy z operatorem konwersji do sf::Color
C/C++
struct Color
{
    int r, g, b, a;
    constexpr Color( int r, int g, int b, int a = 255 )
        : r( r )
        , g( g )
        , b( b )
        , a( a )
    { }
    operator sf::Color() const { return sf::Color( r, g, b, a ); }
};
i używanie jej do do definiowania stałych kolorów, ale to i tak wymaga dodania definicji tych stałych do jakiegoś pliku cpp. http:/​/coliru.stacked-crooked.com/a​/614f328269380406

Ale o co chodzi z tym trivial default constructor
To jest konstruktor domyślny wygenerowany przez kompilator, dla pewnych prostych rodzajów klas. Tobie i tak by się tu nie przydał.
P-99210
« 1 »
  Strona 1 z 1