Typ wyliczeniowy i klasa

0

Mama dwie klasy w jednej (nr1) klasie znajduje sie typ wyliczeniowy.
Klasa z typem wyliczeniowym jest elementem klasy nr2.
Teraz gdzies w programie mam takie cos:

klasa_nr2 obiekt_klasy_nr2;

obiekt_klasy_nr2.obiekt_klasy_nr1.I_TU_NIE_MOGE_WSTAWIĆ_ENUMA

na razie zrobiłem tak ze zamiast enuma mam

int

i poprosto odpowiednie liczby oznaczaja to co maja oznaczć, ale zastosowanie typu wykiczeniowego byłoby znacznie lepsze. Tylko niewiem jak to zrobić.

0

Pokaz kod, bo nie bede strzelal co masz zle.

0

A zadeklarowale obiekt typu enum (np.: typ_enum obiekt), czy po prostu zdefinjowales sobie sam typ (stałe całkowite)? :-P

0

Problem leży przypuszczalnie w tym, że typ wyliczeniowy jest zadeklarowany wewnątrz klasy. Jeśli będziesz go chciał użyć na zewnątz, musi się wysypać.
Zadeklaruj ten typ poza klasą.

0

Wcale sie nie musi wysypac, jesli uzyje sie operatora zakresu, dla odpowiedniej klasy w ktorej sie znajduje enum.

0

Dzieki lawyer [hurra]
Teraz wygląda to tak i działa:

enum eKolor{
        Black,
        White,
        Red,
        Green,
        Aqua,
};
//---------------------------------------------------------------------------
class Prosta{
        public:
                int x1;
                int y1;
                int x2;
                int y2;
                eKolor Kolor;

} ;
//int Linja::Index=0;
//---------------------------------------------------------------------------
class Linja{
        public:
                Prosta Kreska[99];
                int IleKresek;
                int Is;
} ;

Czy to co napisałem jest ok czy powinienem zrobić to w innyy lepszy sposób??

0

Jesli enuma uzywasz tylko dla prostej (pochodnych i jako skladowej) to zamknij to w tej klasie. Pomysl sobie, ze bedziesz mial sporo klas, gdzie bedzie potrzebnych wiele enumow ,co sie naprwade czesto zdarza, przy duzych projektach, to gdy bedziesz je umieszczal globalnie, bedziesz mial coraz wiekszy balagan. Jesli enum odnosi sie tylko do jakiejs klasy (bazowej), to najlepiej zdefiniowac go wewnatrz klasy.

class Prosta{
    public:
	typedef enum tagKolor{
		Black,
		White,
		Red,
		Green,
		Aqua,
	}Kolor,*PKolor;

        int x1;
        int y1;
        int x2;
        int y2;
        Kolor eKolor;

} ;

class Linia{
    public:
        Prosta Kreska[99];
        int IleKresek;
        int Is;
} ; 

[...]

Linia ln;
ln.Kreska[0].eKolor = Prosta::Kolor::Black;

W mniejszych programach moze to sie wydawac zbedne dla niektorych(?), ale uwierz mi, ze przy wiekszych projektach tak zajlepiej robic. Nie tylko odnosi sie to do enumow, ale wszystkich typow, struktur, a czasmi nawet i klas.

0

Wielkie dzieki, ale pozwól ze (dla pełnego zrozumienia zagadnienia) zapytam sie jeszcze o jedną rzecz.

    typedef enum tagKolor{// co oznacza to typedef w tej linijce???

    }Kolor,*PKolor;// hm i poco ta cała linijka, co ona robi???
0

Jest to zwykla definicja typu. Taka jak:

typedef MyInt int;
lub
typedef MyIntPtr *int;
[...]
MyInt liczba; //int liczba
MyIntPtr wskaznik// int *wskaznik;

Moglem zrobic normalnie, ale chcialem abys mial przejzysciej. Tym typedefem nasz zdefiniowane dwa nowe typy zwykly enum i wskaznik na takie wyliczenie. Z enumem moze to nie jest zbyt potrzebne, ale przy strukturach jak najbardziej. Rob tak jesli bedziesz chcial udostepnic komus kod, bedzie latwiejszy do czytania. W ogole cale winapi jest wlasnie tak zorganizowane.

0

Z tym operatorem rozróżniania zakresów to fakt, nie pomyślałem.

Natomiast uważałbym mówiąc, że typedef definiuje nowy typ. Tak tworzy się tylko alias do istniejącego już typu. To nie jest nowy typ, jego tworzysz enumem samym w sobie i - przede wszystkim - tworząc (deklarując i definiując) klasę lub strukturę w stylu C++.

0

A co się jeszcze tyczy typedefa używanego przy definiowaniu struktur: to miało znaczenie w C, natomiast w C++ nie jest właściwie potrzebne. W C chodziło najwyraźniej o to, że aby zadeklarować zmienną strukturalną, trzeba było napisać tak:

struct nazwa_typu_strukturalnego nazwa_zmiennej, np:
struct Struktura s;

Konieczne tu słowo kluczowe struct było tu dość pokraczną wstawką, której można było uniknąć korzystając z typedef przy definicji struktury:

typedef nazwa_struktury
{
definicja
} alias;

Nawet nie trzeba było nadawać strukturze nazwy, najważniejszy był alias, bo można było zrobić tak:
alias zmienna;

W C++ nie jest to już potrzebne, bo deklarując zmienną strukturalną nie trzeba używać słowa kluczowego struct.

0

Zgadzam sie, wszystko co powiedziales to prawda. W koncu winapi bylo w czystym C napisane. Ale nie zmienia to faktu, ze stosowanie typedefa do definiowania wskaznika (i tez czasami podwojnego), jest estetycznym rozwiazaniem.
Najwazniejsza jednak wlasciwoscia typedefa jest mozliwosc przyslonienia dokladnej implementacji ktora kiedys sie moze zmienic. Prosty przyklad:

typedef GLFloat float;

Gdyby sie jednak okazalo, ze float jest zbyt malo dokladny i potrzeba czegos wiecej, wystarczy wprowadzic mala zmiane:

typedef GLFloat long double;

podmienic zmienic stare biblioteki i wszystko bedzie ok. Jesli nie byloby tego typedefa hmm... no coz, nie kazdemu chyba by sie chcialo we wszystkich plikach zmieniac wszystkie float na long double :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1