• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Losowanie liczb, dziedziczenie wielokrotne.

Object Storage Arubacloud
0 głosów
262 wizyt
pytanie zadane 24 kwietnia 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

Witam, 

wykonuje ćwiczenia dot. wielokrotnego dziedziczenia.

Mam abstrakcyjna klase Person, dwie klasy które po niej dziedzicza, Poker i Gunslinger. 
Klasa Bad dziedziczy wirtualnie po Poker i Gunslinger. 

W klasie gunslinger  i Poker mam metodę która zwraca losowo wybrana liczbę. 

Pytanie, dlaczego w końcowym rezultacie, jeśli załóżmy stworze 2 obiekty gunslinger, + obiekt bad wylosowane wartosci są dla wszytskich takie same? 

 

Ćwiczenie pochodzi z książki Stephena Prata. 

Ponizej kod: 

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
#include <string>
#include <time.h>
#include <cstdlib>

class Person
{
private:
    std::string imie;
    std::string nazwisko;
public:
    virtual void show();
    Person(const char * i ="default",const char * n = "default"): imie(i),nazwisko(n){};
    virtual ~Person() = 0;

};
class Gunsligner : public  virtual Person
{
private:
        int cuts;
public:
    void getC(){std::cout<<cuts;}
    double draw(); 
    Gunsligner(const char * i ="default",const char * n = "default", int c = 0): Person(i,n),cuts(c){};
    virtual void show();

};

class Poker :  public virtual Person
{
public:
    Poker(const char * i ="default",const char * n = "default"):Person(i,n){};
    int draw();//1:52;
    virtual void show();
};

class Bad : public Gunsligner, public Poker
{

public:
   Bad(const char * i = "default", const char * n ="default",int c = 0 )
: Person(i,n),Gunsligner(i,n,c){};
    double Gdraw(){return Gunsligner::draw();}
    int Cdraw(){return Poker::draw();}
    virtual void show();

};

#endif // CLASS_H_INCLUDED
#include <iostream>
#include "class.h"

using namespace std;

 Person::~Person() {};
 void Person::show()
 {
    cout<<imie<<"\n"<<nazwisko<<"\n";
 }
void Gunsligner::show()
 {
    Person::show();
    cout << "Czas wyciagania pistoletu: "
    <<Gunsligner::draw()<<endl;
    cout <<"Liczba naciec: "
    <<cuts<<"\n";

 }
void Poker::show()
{
    Person::show();
    cout << "Karta ma numer: "
    <<Poker::draw();
    cout<<endl;
}
 void Bad::show()
 {
     Person::show();
     cout << "Czas wyciagania pistoletu: "
     <<Gdraw()<<endl;
     cout<< "Liczba naciec: ";
     getC();
     cout << "Karta ma numer: "
     <<Cdraw()<<endl;
     cout<<endl;

 }
int Poker::draw()
{
    srand(time(NULL));
    return rand()%52+1;

}
double Gunsligner::draw()
{
    srand(time(NULL));
    int c;
    int a = rand()% 10+1;
    int b = rand()% 100+1;

    if(a%2 == 0 )
        c = rand()% 78+1;
    else
        c= rand()%56+1;
    return (double)(a+b)/c;
    }

 

1
komentarz 24 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
Bo ziarno jest takie samo.
komentarz 24 kwietnia 2020 przez DragonCoder Nałogowiec (36,500 p.)
Pytanie, czy nie pozostaje tutaj problem diemantowy? Skoro Poker dziedziczy po Person i to samo robi Gunslinger. Wiec jezeli klasa "bad" dziedziczy bo obu klasach, to dziedziczy po klasie Person, wiec chyba lapiej odziedziczyc po klasie person i dodac metody wlasne dla klasy person. Jezeli sa jeszzce inne wspolne metody, to zrob dziedziczenie z dwoch klas
komentarz 24 kwietnia 2020 przez amtrax Dyskutant (9,630 p.)
@DragonCoder Dzięki za odpowiedź :D.  

Kilka tematów temu na forum był wyjaśniany temat z problemem diamentowym. Zdaje sobie z tego sprawę, że nie jest to perfekcyjne rozwiązanie; lecz tak jak mówiłem, pochodzi ono z podręcznika do programowania(Stephen Prata 'Szkoła Programowania'), gdzie wiele zadań niekoniecznie ma sens i odzwierciedlenie, mają być może na celu co innego. Dlatego chcę  kierować się intencjami autora i rozwiązywać je kolejno, ucząc się przy tym (niekoniecznie z książki) czego należy się wystrzegać :D.

 

Pozdrowienia
komentarz 24 kwietnia 2020 przez amtrax Dyskutant (9,630 p.)

@tkz, 

Czy są inne ziarna dla generatora, które dałby efekt liczb losowych? 

1
komentarz 24 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

http://www.cplusplus.com/reference/random/ Istnieje lepsze rozwiązanie, z którego radzę skorzystać. 

Jeżeli chcesz zostać przy swoim rozwiązaniu, możesz zastosować jedną z opcji. https://onlinegdb.com/Syz-5aeY8 Cały problem polega na tym, że kod wykonuje się w mniej niż sekundę, przynajmniej pobieranie czasu dla ziarna. Musisz sztucznie opóźnić pobieranie kolejnego seeda. 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 1,729 wizyt
pytanie zadane 26 maja 2020 w C i C++ przez saju13013 Nowicjusz (230 p.)
0 głosów
1 odpowiedź 509 wizyt
pytanie zadane 29 marca 2020 w C i C++ przez KimVivvi Nowicjusz (120 p.)
0 głosów
1 odpowiedź 496 wizyt
pytanie zadane 18 marca 2020 w C i C++ przez gallaxxyy Początkujący (270 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...