NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: enum nelze deklarovat

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
petr.dar
Člen
Avatar
petr.dar:27.6.2016 6:48

čau lidi, nevěděli by jste proč mi to nebere enumelátor ve třídě? Přikládám kód, kterej sem zjednodušil co nejvíc to šlo:

v main nic nejni:

#include <iostream>
#include "myclass.h"
using namespace std;
int main()
{
    MyClass MClass;
    return 0;
}

třída MyClass:

#ifndef MYCLASS_H
#define MYCLASS_H
#include "sachFigury.h"
class sachFigury;
struct figura;
enum barva_figury;
class MyClass
{
public:
    MyClass();
    ~MyClass();
    void struktura(figura F); // proč struktura jde deklarovat
    void enumer(barva_figury F); // ale enum barva_figury nelze deklarovat
private:
    sachFigury * sF;
};

#endif // MYCLASS_H

a definice

#include "myclass.h"
MyClass::MyClass()
{
    sF = new sachFigury(this);
}

MyClass::~MyClass()
{
    delete sF;
}

void MyClass::struktura(figura F)
{
}
void MyClass::enumer(barva_figury F)
{
}

a třída sachFigury

#ifndef SACHFIGURY_H
#define SACHFIGURY_H
#include "myclass.h"
class MyClass;
enum barva_figury {white,black};
enum figury {dama,vez,strelec,kun,kral,pech,nic};
struct figura
{
    figury figurka;
    barva_figury barva;
};
class sachFigury
{
public:
    sachFigury(MyClass * mc = 0);
    ~sachFigury();
private:
    MyClass * myClass;
};

#endif // SACHFIGURY_H

a definice:

#include "sachFigury.h"
sachFigury::sachFigury(MyClass *mc)
    :myClass(mc)
{}
sachFigury::~sachFigury()
{}

Proč mi nelze deklarovat enum, ale struktura jde v poho?

 
Odpovědět
27.6.2016 6:48
Avatar
B42P6
Člen
Avatar
Odpovídá na petr.dar
B42P6:27.6.2016 11:34

Problem je v tom ze enum nieje mozne forward-deklarovat (neviem ako sa to preklada), forward-deklaracia je deklaracia pri ktorej nieje definicia:

class A; //forward-deklaracia triedy A

//[...]

class A // definicia triedy A
{
    //[...]
};

Ako som uz spomenul enum nieje mozne forward-deklarovat:

enum A; // chyba, enum nieje mozne forward-deklarovat

enum A
{
  //[...]
};

Ak niekoho bude zaujimat Preco to nieje mozne: http://stackoverflow.com/q/71416/4932834

Naviac tam je tiez spomenute ze v C++11 to uz mozne je a ako to dosiahnut.

Spat k tvojmu problemu, troska nerozumies deklaraciam a definiciam, kazda definicia je zaroven aj deklaracia takze tym ze tam mas

#include "sachFigury.h"

v ktorom je enum barva_figury, riadok

enum barva_figury;

je nepotrebny, odstran ho a mas po problemoch. To iste plati aj pre ostatne deklaracie v tvojom kode:

class sachFigury;
struct figura;
class MyClass;

ktore su tiez nepotrebne.

Dufam ze sa na mna pismenka pre dlzne a makcene nehnevaju kedze mam anglicku klavestnicu.

Nahoru Odpovědět
27.6.2016 11:34
'long long long' is too long for GCC
Avatar
B42P6
Člen
Avatar
Odpovídá na B42P6
B42P6:27.6.2016 12:17

*klavesnicu

Nahoru Odpovědět
27.6.2016 12:17
'long long long' is too long for GCC
Avatar
Odpovídá na B42P6
Libor Šimo (libcosenior):27.6.2016 13:21

Myslím, že forward v tomto prípade znamená globálna.

Nahoru Odpovědět
27.6.2016 13:21
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
B42P6
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
B42P6:27.6.2016 14:06

Nie celkom :), forward-declaration je len dekláracia bez definície, nezáleží na tom kde je umiestnená:

int f()
{
        class A;
}

class A
{
        //[...]
};

.

Nahoru Odpovědět
27.6.2016 14:06
'long long long' is too long for GCC
Avatar
Odpovídá na B42P6
Libor Šimo (libcosenior):27.6.2016 18:45

Otazka je, k comu je to dobre.
Chapem, ak je to v hlavickovych suboroch, ale inde nevidim zmysel.
Prevazne sa zaujimam o cecko, nie c++, tam je to asi ine.

Nahoru Odpovědět
27.6.2016 18:45
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
petr.dar
Člen
Avatar
Odpovídá na B42P6
petr.dar:28.6.2016 1:25

nene, když smažu

enum barva_figury;

problém se nevyřeší.

A když smažu

class sachFigury;

nebude to vědět co je sachFigury - další chyba, a to samé platí i o

struct figura;

No nic, už jsem se smířil s tim že to deklarovat nejde, nerozumim tomu proč, nedává to logiku, akorád musim kvůli tomu svůj projekt trochu přeorganizovat.

 
Nahoru Odpovědět
28.6.2016 1:25
Avatar
martanec
Člen
Avatar
martanec:28.6.2016 8:55

v subore sachFigury.h include-ujes myclass.h a v subore myclass.h include-ujes sachFigury.h ... to asi nebude v poriadku s kostolnym poriadkom. Ked este k tomu pridas fakt, ze v kazdom hlavickovom subore mas deklaraciu enumu aj triedy (ci uz doprednu, alebo nie), tak sa ani necudujem, ze dostavas error...
Dost mozne, ze sa mylim. No v kazdom pripade by si sem mohol post-nut error, ktory dostavas.

 
Nahoru Odpovědět
28.6.2016 8:55
Avatar
petr.dar
Člen
Avatar
Odpovídá na martanec
petr.dar:28.6.2016 23:17

No, includuju to, protože to všechno používám :-) když to všechno smažu, taky mi to hází error, nebo vám to bez toho funguje? Nevim jak bych to měl napsat lépe.

 
Nahoru Odpovědět
28.6.2016 23:17
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 9 zpráv z 9.