• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Typy wyliczeniowe w obiektowym (C++)

42 Warsaw Coding Academy
0 głosów
913 wizyt
pytanie zadane 28 maja 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Napisałem krótki program(działa poprawnie):

#ifndef P_H_
#define P_H_
class Typy
{
        private:
                enum struct cos {Pon};
                cos zmienna = cos::Pon;
        public:
                Typy();
};
#endif
#include <iostream>
#include "p.h"

Typy::Typy() {  std::cout << "Inicjalizacja z klasy(typu wyliczeniowego): " << sizeof(this->zmienna) << "\n";}

int main()
{
        short liczba = 5;
        std::cout << "Inicjalizacja z main(typu short): " << sizeof(liczba) << "\n";
       Typy obiekt1;
        return 0;       
}

Chciałem do typu enum dodać typ danych (widziałem taki sposób);

enum struct : short cos {Pon};

ale pokazuje mi błąd. W jaki sposób mógłbym dodać do tego typ danych.

1 odpowiedź

+1 głos
odpowiedź 28 maja 2018 przez niezalogowany
wybrane 28 maja 2018 przez Sic
 
Najlepsza
enum struct cos :short { Pon };

http://en.cppreference.com/w/cpp/language/enum

komentarz 28 maja 2018 przez Sic Dyskutant (8,510 p.)
edycja 28 maja 2018 przez Sic
Dziękuę bardzo. Był błąd w książce.

A mam jeszcze jedno pytanie dotyczące operatora zasięgu '::'. Rozumiem przy odwoływaniu się do składowej klasy, ale dlaczego wykorzystuję się również do zmiennej umieszczonej w struktorze zamiast '.' ?
1
komentarz 28 maja 2018 przez RafalS VIP (122,820 p.)

Jeśli pytasz o te linjki
 

                enum struct cos {Pon};
                cos zmienna = cos::Pon;

to wcale nie odwołuje się do struktury tylko do enuma. Istnieją dwa typy enumów w C++:

http://en.cppreference.com/w/cpp/language/enum#Scoped_enumerations.28since_C.2B.2B11.29

Jeden jest pozostałością po C (unscoped enum), definicja wygląda tak:

enum nazwaEnuma{opcja1, opcja2 = 10, opcja3}

Wtedy stałe opcja1, opcja2 itd lądują w obszarze globalnym, tzn że możesz się do nich normalnie odwoływać bez żadnego operatora zasięgu.

Drugi to scoped enum. Definicja różni się tym, że po enum pisze się jeszcze class albo struct (dowolnie, bez różnicy). Wtedy wszystkie stałe ze środka enuma lądują w przestrzeni nazw o nazwie tego enuma, czyli nie możesz się do nich odwołac w kodzie normalnie czyli

nazwaEnuma nazwaZmiennej = opcja1

tylko musisz użyć operatora zakresu, żeby wyciągnąć opcje z enuma. Jest to bardzo fajne, bo nie zaśmieca Ci obszaru globalnego:

nazwaEnuma nazwaZmiennej = nazwaEnuma::opcja1


 

komentarz 28 maja 2018 przez Sic Dyskutant (8,510 p.)
Dzięki za wytłumaczenie nie wykorzystałem z nich wcześniej, a dopiero co wszedłem w programowanie obiektowe.

Podobne pytania

0 głosów
1 odpowiedź 858 wizyt
pytanie zadane 15 stycznia 2017 w Java przez Szymon Ciamaga Obywatel (1,980 p.)
0 głosów
1 odpowiedź 1,543 wizyt
pytanie zadane 7 września 2017 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 511 wizyt
pytanie zadane 23 maja 2018 w C i C++ przez Agnes Użytkownik (990 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...