Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C++ enum, struct, warning

Aktivity
Avatar
Adam
Člen
Avatar
Adam:14.10.2020 20:31

Dobrý den,
nevím co je nutné opravit, popřípadě připsat, aby nebyl warning. Nachází se na řádku "p_osoba->Pohlavi = pMuz"
"C26812: Typ výčtu (enum) ePohlavi není vymezený. Místo enum upřednostňujte enum class (Enum.3)"

#include <iostream>
#include <string.h>

typedef enum {
    pZena, pMuz
}ePohlavi;

typedef struct {
    char Jmeno[20];
    char Prijmeni[20];
    unsigned char Vek;
    ePohlavi Pohlavi;
}Osoba;

void Vypis(const Osoba& osoba) {
    std::cout << "Jmeno: " << osoba.Jmeno << " Prijmeni: " << osoba.Prijmeni << " Vek: " << (int)osoba.Vek << " Pohlavi: ";
    switch (osoba.Pohlavi) {
        case pMuz: std::cout << " muz" << std::endl;
            break;
        case pZena: std::cout << " zena" << std::endl;
           break;
    }
}

int main()
{
    Osoba osoba = { "Lukas", "Novak", 35, pMuz };
    Osoba* p_osoba = new Osoba;

    strcpy_s(p_osoba->Jmeno, 20 ,"Adam");
    strcpy_s(p_osoba->Prijmeni, 20,  "Novak");
    p_osoba->Vek = 26;
    p_osoba->Pohlavi = pMuz;

    Vypis(osoba);
    Vypis(*p_osoba);

    delete p_osoba;
    p_osoba = NULL;
    return 0;

Předem díky za každou radu.

Editováno 14.10.2020 20:33
 
Odpovědět
14.10.2020 20:31
Avatar
Odpovídá na Adam
Patrik Valkovič:14.10.2020 22:50

Ahoj. Od standardu C++11 je v C++ upřednostňován tzv. scoped enum. Ten se zapisuje takhle:

enum class ePohlavi {
    pZena, pMuz
};

Osoba osoba = { "Lukas", "Novak", 35, ePohlavi::pMuz };

Jde o to, že bez toho klíčového slova class můžeš kdekoliv programu použít právě pMuz a pZena (tj. unscoped enum). V případě scoped enum je součástí jména právě i název enumu, tedy ePohlavi::pMuz a tak není "globální" prostor jmen tak zanesen.

V C++ se také již nepíše typedef, ale struct Nazev popř. enum Nazev. Verze s typedef je spíše pro čisté C. Pokud chápu kontext, tak kompiluješ ve Visual Studiu, který vše kompiluje právě pod C++.

V každém případě se jedná pouze o Warning a ne o chybu, program bude fungovat a ten warning je spíše takové upozornění od novějších standardů C++. Pokud se učíš C, můžeš s tím pokračovat. Pokud C++, je lepší to opravit a také opravit typedef.

Nahoru Odpovědět
14.10.2020 22:50
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Adam
Člen
Avatar
Odpovídá na Patrik Valkovič
Adam:15.10.2020 8:01

Díky moc, zas jsem se dozvěděl něco nového.

 
Nahoru Odpovědět
15.10.2020 8:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.