Wywoływanie funkcji innej klasy

Wywoływanie funkcji innej klasy
MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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

Kopiuj
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?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

a jak został zadeklarowany oraz zainicjalizowany obiekt kostka?

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

Hm, zmieniłem tak:

Kopiuj
 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

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

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

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
2

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

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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();

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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 ;)

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

Tak tworzę 4 potwory

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

tutaj jest konstruktor

Kopiuj
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

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

Kopiuj
const char *pionek_potwora::name()
  {
   static const char * names[]={"Aaaaa","Bbbbb","Ccccc","Dddddd"};
   return names[Numer_Nazwy];
  }
MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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'

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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.

robcio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Opole
  • Postów: 533
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.

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

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

Kopiuj
 const char *pionek_potwora::typ()
  {
   static const typy[]={"AT-AT","TIE Fighter","Szturmowiec","Droid"};
   return typy[numer_typu];
  }
Kopiuj
 void pionek_potwora::set_typ(int n) {
    numer_typu = n;
}
Kopiuj
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

Kopiuj
    for(int i=0; i<4; i++){pot[i] = new pionek_potwora(40/(i+1), i+1, i);}
 
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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?

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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ć :)

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
void pionek_potwora:wypisz()
  {
   cout<<sila<<' '<<zasieg<<' '<<typ()<<endl;
  }
MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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.

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0
Kopiuj
 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?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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;
MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

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

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

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

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

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

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

Tworzę listę pól w konstruktorze:

Kopiuj
lista_pol = new pole[rozmiar];

metoda ustaw:

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

Tak ustawiam pionki na planszy:

Kopiuj
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'

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

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

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0
Kopiuj
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ęść.

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
0

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

Kopiuj
 pot[i]->podaj_pozycje()

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

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.