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 class Klasa { public: class WindowSettings { public: const static int windowH = }; enum class PlayerSettings : int { 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? |
|
Monika90 |
» 2013-12-13 17:25:38 |
|
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. |
|
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? |
|
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? |
|
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? |
|
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 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 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/614f328269380406Ale 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ł. |
|
« 1 » |