Typy wyliczeniowe w klasach

0

Witam,
mam pewien problem: otóż mam utworzyć pole płeć, które ma korzystać z typu wyliczeniowego.. No i tu pojawia się problem, ponieważ mam klasę Pies i klasę Zwierze, klasa Pies dziedziczy po klasie Zwierze. W klasie Zwierze mam wirtualną metodę, która zwraca napis w zależności od klasy, czyli np. gdy wywołuję ją poprzez obiekt klasy Pies, wypisuje mi "Pies", gdy przez obiekt klasy Zwierze to wypisuje "Zwierze". Następnie mam metodę w klasie Zwierze, która wypisuje wszystkie pola.. No i teraz mam utworzyć w klasie Pies pole płeć, które korzysta z typu wyliczeniowego, a wyświetlać ma to metoda z klasy Zwierze.. Choć tylko klasa Pies posiada pole płeć, jak to wszystko połączyć i jak poprawnie utworzyć takie pole korzystające z typu wyliczeniowego?

enum plec = {KOBIETA, MEZCZYZNA};
plec p;
0

Klasa Pies dziedziczy po klasie Zwierze i oczywiście rozszerza możliwości,
ale działają w jedną stronę. Klasa Zwierze nie wyświetli pola, którego nie ma.

0

Czyli po prostu muszę tą metodę stworzyć jako wirtualną i dla każdej klasy tworzyć ją inaczej. No, ale tu pojawiał mi się drugi problem, że pole imię jest prywatne w klasie Zwierze, a klasa Pies używa konstruktora klasy Zwierze i pojawia się problem gdy metodą chcę wyświetlić imię, bo leży ono w klasie Zwierze, a nie klasie Pies.

0

Czyli po prostu muszę tą metodę stworzyć jako wirtualną i dla każdej klasy tworzyć ją inaczej.

Tak. Rozszerzać i zmieniać jeśli jest taka konieczność. Oczywiście jeśli korzystasz z polimorfizmu,
bo można też wywoływać metody klasy bazowej w metodzie klasy pochodnej.

class Pies : public Zwierze
{
    //...
    void pokaz()
    {
        Zwierze::pokaz();
        // tutaj kod dotyczący klasy Pies
    }
} 

private zastąp protected.

0

Dobrze, dziękuję.
Teraz pozostało mi stworzyć ten typ wyliczeniowy, bo dalsza część zadania jest taka, że mam przeciążyć operator + i za jego pomocą gdy dodamy dwa psy o różnych płciach to tworzymy nowy z losową płcią, a jego imię to zlepek liter obu imion pozostałych psów.. Tak jak wiem, żeby stworzyć zlepek imion to pewnie trzeba będzie stworzyć generator liczb losowych i wstawić go do substringa. Tak nie wiem jak zrobić to z losową płcią. To prawda, że gdy utworzę

enum plec = {KOBIETA, MEZCZYZNA};

to KOBIETA przyjmuje tak jakby wartość 0, a MEZCZYZNA wartość 1? I też mogę to zrobić generatorem liczb losowych?

0

to KOBIETA przyjmuje tak jakby wartość 0, a MEZCZYZNA wartość 1? I też mogę to zrobić generatorem liczb losowych?

Tak. Możesz.

plec p = (rand() % 2) ?  plec::MEZCZYZNA : plec::KOBIETA;  

Oczywiście polecam random.

0

Czyli tak jak myślałem, ale nadal nie wiem jak tą płeć wyświetlić...]
I w sumie nie wiem jak lepiej nadawać płeć obiektowi, który sam tworzę? Konstruktor?

0
std::array<std::string, 2u> plcie{"ZENSKA", "MESKA"};
std::cout << plcie[static_cast<std::size_t>(p)]; 
0

O rany.. Muszę przyznać, że w takich zapisach jestem zielony.. Za pomocą zwykłego couta to jest nie do zrobienia? :D

0

Można to zrobić na kilka sposobów:

if(plec::KOBIETA == p){
    std::cout << "Zenska";
else {
    std::cotu << "Meska";
} 

edit:

I w sumie nie wiem jak lepiej nadawać płeć obiektowi, który sam tworzę? Konstruktor?

Oczywiście, że tak. W sumie to obiekt jest jednej płci od urodzenia (poza trans wśród ludzi :) i niektórych gatunków które zmieniają w razie potrzeby,
ale do tego można dać osobną metodę).

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