Problem z typem wyliczeniowym

0

Witam, mam pewien problem z typem wyliczeniowym.
Mam zadeklarować typ wyliczeniowy z kolorami a nastepnie utworzyc zmienna tego typu i za pomoca petli for wypisac odpowiadajace jej wartosci.
Zrobilem to tak:

 #include <iostream>
using namespace std;

enum Colors { black, red, white  };

int main()
{
    Colors ColorType;
    for(ColorType = black; ColorType < white; ColorType)
    cout << ColorType << endl;

}

i nie działa bo program napieprza zerami...

Zrobiłem to tak:

#include <iostream>
using namespace std;

enum Colors {black, red, white};

int main()
{
    for(int i = 0;; i++)
    {
        switch(i)
        {
            case black:
            cout << black << endl;
            break;

            case red:
            cout << red << endl;
            break;

            case white:
            cout << white << endl;
            break;
        }
    }
}
 

Ale tutaj nigdzie nie deklaruje tej zmiennej tego typu... więc nie zgodne z poleceniem. Możecie mnie nakierować jak to zrobić?

0

To zadanie pozbawione jest sensu. W C++ enum to nie jest int, enum nie służy do tego, żeby po nim iterować. Jeżeli już musisz, jako licznika pętli powinieneś użyć liczby int.

#include <iostream>
 
using namespace std;
 
enum Colors {
  black,
  red,
  white
};
 
int main() {
  for(int i = black; i <= white; ++i) {
    cout << i << endl;
  }
 
  return 0;
}

Oczywiście to dalej jest bez sensu, bo enum nie musi mieć wartości co 1.

0

Bez sensu powiadasz?

Create a program that uses an enumeration of colors. Create a variable of this enum type and print out all the numbers that correspond with the color names, using a for loop.

Może źle treść zrozumiałem?

0

Zrozumiałeś dobrze. To spełnia wszystkie warunki zadania:

#include <iostream>
 
using namespace std;
 
enum Colors {
  black,
  red,
  white
};
 
// To jest strasznie glupie.
inline Colors operator++(Colors &c) {
  // Jawna konwersja na int nie jest konieczna.
  // Natomiast ta druga jest, poniewaz wynikiem
  // dodawania jest int, a nie enum.
  c = static_cast<Colors>(static_cast<int>(c) + 1);
  return c;
}
 
int main() {
  // Uwaga: `c <= white` dziala, bo w takim wypadku
  // enum jest porownywany jak int.
  for(Colors c = black; c <= white; ++c) {
    cout << c << endl;
  }
 
}

Dalej twierdze, że to nie ma sensu. Zastanów się, co by było, gdyby Colors miały wartości 1, 5 i 8?

0

oj nie nie. w thinking in c++ w tym rozdziale nie bylo nic o przeciazeniu operatorow. rozdzial " jezyk c w c++"

0

No jeśli chcemy robić takie cuda, to trzeba po prostu pamiętać, by enum miał kolejne, ściśle określone wartości. Wtedy można go sobie do woli konwertować na inta i z powrotem.
Czasami tak trzeba.

Przykład: ostatnio (w C#, ale na jedno wychodzi) do dyspozycji miałem tylko int-a, a chciałem żeby różne wartości miały konkretne znaczenie, a nawet żeby niektóre bity były niezależnymi flagami. Można zdefiniować stałe, ale wolałem zrobić enum-a i na nim operować, a tylko przy zapisie rzucać go na int.

0

Azerien ale twoja wypowiedz nie rozwiazala mojego problemu - jak to zrobic zgodnie z poleceniem

0

W sumie to się do końca tego nie da zrobić. Jedyna opcja to tak jak już wcześniej Ci dobrzy ludzie napisali.

0

Ten przeciążony operator jest oczywiście nadmiarowy, wystarczy zamiast ++c dać:

c = static_cast<Colors>(c + 1)

Chciałem tylko pokazać jak zrobić to "po ludzku" bo w for w 95% przypadków daje się właśnie ++costam i to jakoś "dobrze/standardowo" wygląda.

0

Czyli koniecznie jest rzutowanie? :(

0

Konieczne, ale co Ci się nie podoba w nim? Napisałem Ci wcześniej, w C++ enum to nie int, inaczej się nie da. Pewnie, że może i czasem trzeba, tak jak napisał Azarien.

0

Czyli dałbyś cały kod jak to ma wyglądać bo sie pogubiłem troszke..?

0
#include <iostream>
 
using namespace std;
 
enum Colors {
  black,
  red,
  white
};
 
int main() {
  // `c <= white` dziala, bo w takim wypadku
  // enum jest porownywany jak int. Dodawanie
  // dziala w ten sam sposob, ale jego wynikiem
  // nie jest enum, wiec trzeba go jawnie
  // rzutowac.
  for(Colors c = black; c <= white; c = static_cast<Colors>(c + 1)) {
    cout << c << endl;
  }
 
}
0

Dzięki

0

rzutujesz to na tym int.. a jakbym chciał pozniej z powrotem na typ enum rzutowac to moge?

0

Przecież rzutuje na Colors, to właśnie to o co pytasz. Jeszcze raz:

  • enum -> int - konwersja niejawna, zawsze ma jakiś sens.
  • int -> enum - konwersja jawna za pomocą static_cast, może nie mieć sensu.
0

czyli on sie jakby automatycznie (niejawnie) rzutuje na int a my potem jawnym rzutowaniem mowimy mu; traktuj jakby to byl typ colors?

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