Wywoływanie funkcji innej klasy

0

Chciałbym, żeby obiekt klasy "pionek" przesuwał się po planszy o wartość podaną na kostce - kostka to osobna klasa która ma funkcję losującą wartości 1-6

void pionek::przesun(int n)
{
    n += kostka.losuj();
} 

Przy takim zapisie otrzymuję błąd: "expected primary-expression before '.' token". Co należy poprawić albo zapisać inaczej?

1

a jak został zadeklarowany oraz zainicjalizowany obiekt kostka?

0

Hm, zmieniłem tak:

 void pionek::przesun(int n)
{
    kostka kostka;
    n += kostka.losuj();
}

Po przeczytaniu tego co napisałeś stwierdziłem, że nie ma przecież jeszcze żadnej kostki, bo jest tylko definicja klasy. Więc po prostu stworzyłem obiekt i przeszło bez błędów, ale nie wiem czy to jest dobre rozwiązanie :P

1

void pionek::przesun(int n)
{
kostka k;
n += k.losuj();
}

2

@Mruvek, a tak swoją drogą to jak grasz na żywo w gry to co ture używasz innej nowej kostki?

0

Właśnie wróciłem z tym pytaniem, bo wyszło mi na to, że w każdej nowej funkcji gdzie chcę zwracać wartość kostki tworzę nową, a chciałbym przecież wszędzie używać tej jednej, bo przy wywoływaniu pokazuje mi wartość kostki, która nie została ustawiona i wyświetla się adres. Nie wiem jak teraz to zrobić, żeby w każdym miejscu programu było wiadomo, że chodzi mi o jeden i ten sam obiekt.

1

Musisz mieć:
obiekt - Plansza, który posiada obiekt Kostka, oraz kilka (tablicę) obiektów pionek (ewentualnie przez tablicę obiektów Gracz)
Rozsądnym posunięciem będzie jeżeli każdy z tych obiektów:
Kostka, Pionek (ewentualnie Gracz) posiadali referencję na obiekt Plansza.
wtedy piszesz:
n+=MojaPlansza.KostkaPlanszy.losuj();

Mniej rozsądne podejście - statyczna metoda klasy pionek:
static kostka &JedynaKostka() { static kostka K; return K; }
wtedy piszesz:
n+=JedynaKostka().losuj();

0

Wszystko przeniesione do klasy plansza. Teraz może faktycznie wygląda to logiczniej i rozgrywa się na planszy. W mainie jest wywoływane tylko plansza.graj(); a działa jak poprzednio. Wrócę na pewno z następnymi pytaniami ;)

0

Tak tworzę 4 potwory

for(int i=0; i<4; i++){pot[i] = new pionek_potwora(40/(i+1), i+1, ???);}

tutaj jest konstruktor

pionek_potwora::pionek_potwora(int nsila, int nzasieg, ???)
{
    this->sila = nsila;
    this->zasieg = nzasieg;
    ???
}

O ile siłę i zasięg potrafię dopisać, to chciałbym teraz w miejscu ??? mieć nazwy, które są wpisane kolejno w tablicy, na liście czy czymkolwiek co by działało, bo aktualnie nie mam pomysłu. Chciałem zadeklarować tablicę stringów gdzie od razu zainicjalizuję przy deklaracji 4 nazwy, ale nie wychodziło, bo nawet nie wiem czy to jest poprawne.

1

Wpisz tam tylko liczbę oznaczającą numer nazwy oraz dorób metodę:

const char *pionek_potwora::name()
  {
   static const char * names[]={"Aaaaa","Bbbbb","Ccccc","Dddddd"};
   return names[Numer_Nazwy];
  }
0

Obawiam się, że nie zrozumiałem. Dorobiłem taką metodę, ale nie wiem co ona zwraca po returnie i skąd przy wywołaniu ma później wiedzieć że to stąd jest np '2' oznaczające 'bbbbb'

0

Nie mogę dodać Numer_nazwy, dodaje to jako int, ale wtedy jest invalid conversion z const char na int. A ineczej dalej nie rozumiem jak to działa.

0

dodaj Numer_Nazwy do klasy pionek potwora później musisz po prostu ustawić nazwę np tak:
void setNazwa(int n) {
Numer_Nazwy = n;
}
Wtedy jak będziesz wywoływał metodę pionek_potwora::name to zwróci ona poprawną nazwę pionka_potwora.

0

Teraz już zupełnie sobie namieszałem:
invalid conversion from 'const char*' to 'int'
ISO C++ forbids declaration of 'typy' with no type

 const char *pionek_potwora::typ()
  {
   static const typy[]={"AT-AT","TIE Fighter","Szturmowiec","Droid"};
   return typy[numer_typu];
  }
 void pionek_potwora::set_typ(int n) {
    numer_typu = n;
}
class pionek_potwora : public pionek
{
private:
    int sila;
    int zasieg;
    int numer_typu;
public:
    const char *typ();
    pionek_potwora(int nsila, int nzasieg, int numer_typu);
    int get_sila();
    int get_zasieg();
    void set_typ(int n);
}; 

Tutaj chcę podawać jako trzeci parametr 'i' - tak jak zapisane niżej - który po prostu oznacza któryś element w tablicy nazw. Liczyłem na coś prostego w stylu string tab[4] = {'aa', 'bb', 'cc', 'dd'} i żeby wywołanie 1 dawało nam bb

    for(int i=0; i<4; i++){pot[i] = new pionek_potwora(40/(i+1), i+1, i);}
 
1

static const char * names to nie to samo co static const names
Poco ci ten set_typ ?
Przecież masz to w konstruktorze.
Zamierzasz zmieniać nazwę pionka?

0

Musiałem gdzieś to zjeść a nie zauważyłem, bo byłem przekonany, że tak jak skopiowałem z forum jest okej. Nieważne
Kompiluje się, ale dalej nie wiem jak wywołać nazwę potwora obok jego zasięgu i siły. Dodatkowo 'program przestał działać' w momencie gdzie powinno wyświetlać to co już wcześniej działało normalnie - nie wiem wtedy co to już znaczy. Wcześniej debugger wyrzucał segmentation fault, a teraz nic, ale błąd ten sam. Nie wiem w którym miejscu błąd, bo zmieniałem jedynie potwory, a wyrzuca się przy pionkach gracza.

set_typ nie wiem po co, bo tak napisał ktoś wyżej, chyba, że to do niego pytanie : ) Potworów nie mam zamiaru zmieniać nazwy, mogłem to jakoś naookoło ustawić po kolei i by działało, ale wymyśliłem sobie tak i właśnie próbuję się dowiedzieć jak to powinno wyglądać :)

0
void pionek_potwora:wypisz()
  {
   cout<<sila<<' '<<zasieg<<' '<<typ()<<endl;
  }
0

Zrobiłem inaczej, teraz działa, wcześniej byłem przekonany że robiłem to samo i nie działało.

Gorzej, że wyrzuca 'program przestał działać' po wyświetleniu części rzeczy i nie wiem jak szukać błędów.

0
 if (p1[0]->podaj_pozycje() == pot[0]->podaj_pozycje()){
            cout << " Trafiles na " << pot[0]->typ() << " tracisz " << pot[0]->get_sila() << " zdrowia!";
            p1[0]->set_zdrowie(p1[0]->get_zdrowie()-pot[0]->get_sila());
        }

Sprawdzam czy pionek[0] nie jest na tym samym polu co potwór[0], jak sprawdzić czy jakikolwiek pionek nie jest na tym samym polu co jakikolwiek potwór?

0

Inaczej zorganizować klasy:
Plansza zawiera listę obiektów Pole,
Pole zawiera wskaźnik na Obiekt. (pusty wskaźnik - puste pole)
Od Obiekt pochodzi Pionek oraz Potwór

0

Rozumiem, że Pola mają być osobną klasą, wskaźniki na Pionek (od pionka pochodzi pionek_gracza, pionek_potwora), ale nie bardzo wiem jak wykonać listę obiektów Pole i jak zorganizować to dalej, że wskazujący na coś wskaźnik co robi, i pusty co robi.

0
Pole *Lista;
Lista=new Pole[IloscTychPol];

if(!Pole[x].Obiekt) cout<<"pole jest puste"<<endl;
else if(Pole[x].Obiekt->CzyPotwor()) cout<<"na polu stoi potwór"<<endl; // to można zorganizować inaczej, np typeid
else cout<<"na polu stoi inny pionek"<<endl;
0

No okej, ale teraz Pionek ustawiał się na planszy w ten sposób:

void pionek::set_pozycja(int n)
{
    this->pozycja = n;
}
 

Jak teraz zamiast n podawać konkretne pole, które tworzy się w konstruktorze planszy?

0

Teraz nie pionek ustawia się na plansze tylko plansza ustawia pionka.
void Plansza::ustaw(unsigned pozycja,Pionek *p) { Lista[pozycja]=p; }

0

Tworzę listę pól w konstruktorze:

lista_pol = new pole[rozmiar];

metoda ustaw:

void plansza::ustaw(int pozycja, pionek *p)
{
    lista_pol[pozycja] = p;
}

Tak ustawiam pionki na planszy:

p1[0]->set_nazwa(1,1);
    ustaw(0, *p1);

    for(int i=0; i<4; i++){
        ustaw((rand()%60+5) ,pot[i]);
    };

I wyrzuca błąd przy tej metodzie ustaw. Dalej chyba nie rozumiem jak to ma działać, co na co pokazywać, po co pola i ich lista :/
no match for 'operator=' in '(((plansza)this)->plansza::lista_pol + ((unsigned int)pozycja)) = p'

0

ustaw(0,p1);
lub:
ustaw(0,&p1[0]);
tak samo z potworami.

0
class pole
{
public:
    pionek p;
    pole();
};

Wolałbym żebyś wytłumaczył też jak to ma działać oprócz poprawiania kodu, bo tak co chwila nie wiem co mam robić, bo nie wiem co ma mieć w sobie jaką część.

0

Tak sprawdzałem na której pozycji znajduje się potwór. Podawał swoją wartość 'pozycja' która była po prostu intem.

 pot[i]->podaj_pozycje()

Jak teraz sprawdzić na jakim polu znajduje się konkretny potwór, jeśli ustawiam je na planszy tak:

 for(int i=0; i<4; i++){
        ustaw((rand()%60+5) ,pot[i]);
    };

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