Autor Wątek: Klasa wykorzystująca wektor innej klasy  (Przeczytany 1295 razy)

Offline .S.

  • Użytkownik

# Maj 02, 2010, 23:01:47
Otóż mam sobie klasę Statek, w której jest metoda tworząca nowy Pocisk, który jest inną klasą. Problem w tym, że jeżeli przekazuję wektor klasy Pocisk to metody Statku to wyskakuje błąd mówiący, że Pocisk to "undeclared identifier"

Jakieś pomysły jak sobie z tym poradzić? ???

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Maj 02, 2010, 23:03:26
Statek.h
class Pocisk;

class Statek {
// ...
}

Offline cybek

  • Użytkownik
    • Strona domowa!

# Maj 02, 2010, 23:04:16
Ja tam bym zadeklarował ten wektor najpierw..

Offline nilphilus

  • Użytkownik
    • wordpress

# Maj 02, 2010, 23:14:55
A po co chcesz przekazywać wektor pocisku do statku?

Offline .S.

  • Użytkownik

# Maj 03, 2010, 12:37:41
A po co chcesz przekazywać wektor pocisku do statku?

Żeby w przypadku naciśnięcia strzałki tworzony był "nowy" pocisk w wektorze.

Statek.h
class Pocisk;

class Statek {
// ...
}

W Statku.h jest już Pocisk.h

Ja tam bym zadeklarował ten wektor najpierw..

Jest zadeklarowany. Problem tkwi w tym że metoda klasy statek "nie widzi" klasy pocisk

Offline cybek

  • Użytkownik
    • Strona domowa!

# Maj 03, 2010, 12:45:51
Ja bym zrobił klasę pocisk i jej wektor wepchnął do klasy statek.

Offline djsmtih

  • Użytkownik

# Maj 03, 2010, 13:31:46
Ja bym zrobił klase Objekt i dziedziczenie , ale najprościej to tak jak Kos napisał.

Offline Chester2000

  • Użytkownik

# Maj 03, 2010, 13:53:48
Jest zadeklarowany. Problem tkwi w tym że metoda klasy statek "nie widzi" klasy pocisk

Pokaz metodę klasy statek, którą chcesz utworzyć ten pocisk.   

Offline .S.

  • Użytkownik

# Maj 03, 2010, 15:10:26
Statek.h
class Pocisk;

class Statek {
// ...
}

 :o
Dzięki działa.
Tylko nie rozumiem dlaczego to nie jest to samo co
Statek.h
Pocisk.h

class Statek {
// ...
}

I jeszcze takie pytanko czy metoda może przekazywać "Samą siebie" (klasę) do metody innej klasy?

Offline lmmilewski

  • Użytkownik
    • Łukasz Milewski - devblog

# Maj 03, 2010, 15:40:47
Tylko nie rozumiem dlaczego to nie jest to samo co
Statek.h
Pocisk.h

class Statek {
// ...
}
W sensie #include "Pocisk.h"? W przypadku class Pocisk masz niekompletny typ Pocisk (możesz używać tylko referencji/wskaźnika na niego i nie możesz wywoływać metod na nim). Z drugiej strony nie masz problemów z cyklicznymi zależnościami, a i kompilacja jest szybsza :-)

#include daje Ci trochę więcej niż class, więc jeżeli to nie działało to znaczy, że w Pocisk.h masz jakiś include do Statek.h (być może pośrednio przez inny plik).

I jeszcze takie pytanko czy metoda może przekazywać "Samą siebie" (klasę) do metody innej klasy?
Możesz przekazać this.

Offline Kos

  • Użytkownik
    • kos.gd

# Maj 03, 2010, 17:11:20
Statek.h
class Pocisk;

class Statek {
// ...
}

 :o
Dzięki działa.
Tylko nie rozumiem dlaczego to nie jest to samo co
Statek.h
Pocisk.h

class Statek {
// ...
}

Ha, trafiłem? :)

Pewnie rozbiłeś się o coś takiego:
pocisk.h
Kod: (cpp) [Zaznacz]
#ifndef POCISK_H_
#define POCISK_H_
// btw, powyzej mogloby byc rownie dobrze '#pragma once' - dziala +- tak samo

#include "Statek.h"
class Pocisk {
// ...
};

#endif // POCISK_H_

statek.h
Kod: (cpp) [Zaznacz]
#ifndef STATEK_H_
#define STATEK_H_

#include "Pocisk.h"
class Statek {
// ...
};

#endif // STATEK_H_

To teraz proszę poświęć mi 10 minut. Weź sobie kartkę, ołówek, wciel się w preprocesor i spróbuj rozpisać sobie, jak wyglądałby po preprocessingu taki moduł:

pocisk.cpp
Kod: (cpp) [Zaznacz]
#include "pocisk.h"
#include "statek.h"

// dalej jakies metody - bez znaczenia :)

Jak działa #ifdef i #define powinieneś wiedzieć. Przypomnę, że #include wstawia tępo treść danego pliku w dane miejsce - nic poza tym.

Gdy już skończysz z tym ćwiczeniem, zobacz jak będzie wyglądał po preprocessingu moduł pocisk.cpp jeśli w nagłówkach zamiast #include zrobisz deklaracje zapowiadające, tak jak powiedziałem. Problem stanie się dla Ciebie jasny jak słońce. :)

Dawanie wędki for the win.



Cytuj
I jeszcze takie pytanko czy metoda może przekazywać "Samą siebie" (klasę) do metody innej klasy?
Nie może 'klasy', bo klasa nie jest obiektem (przynajmniej w C++) i nie można jej nigdzie przekazywać. Można z niej zrobić najwyżej parametr szablonu.
Jeśli chodzi Ci o przekazanie z poziomu metody wywołanej na obiekcie X wskaźnika na ten obiekt, to oczywiście, że można - słowo 'this', jak powiedziano.

Offline nilphilus

  • Użytkownik
    • wordpress

# Maj 03, 2010, 17:14:52
Dobra, podsumuje się, bo się pogubiłem. Klasa statek ma wektor (tablicę) pocisków? [początkowo myślałem, że chodzi o kierunek w jakim pocisk leci]


Statek wie o istnieniu pocisków (bo je tworzy), sam Pocisk nie musi się interesować statkiem. Do sprawdzania kolizji służy osobna klasa.
No ale dobra, przejdę trochę bardziej do sedna, co prawda trochę można by tu poprawić, ale nie jest chyba źle ;-)


//Interfejs, tak jakbyś w przyszłości chciał dodać inne rodzaje pocisków.
class IPocisk
{
  public virtual Wystrzel(Vector2 kierunek) = 0;
};

/* tutaj, lub gdzie indziej klasa Pocisk która dziedziczy po IPocisk */

class Statek
{
    private:
     std::vector<IPocisk*> pociski;


     void wystrzel( IPocisk* pocisk )
{
    pociski.add(pocisk);
    pocisk.Wystrzel();
}

public:
void wystrzelTorpede( Vector2 kierunek )
{
  //przyjmijmy, że torpeda pobiera kierunek i prędkość
  this.wystrzel(new Torpeda(kierunek, 10f));
          //Engine.Physic.AddObject( torpeda ); // tak przykładowo ;->
}


void zrzucBombeGlebinowa( )
{
//Bomba glebinowa pobiera pozycje statku i leci w dół - za to jest odpowiedzialna bomba głębinowa
this.wystrzel(new BombaGlebinowa( pobierzPozycjeStatku() ) );
}
}

Offline .S.

  • Użytkownik

# Maj 03, 2010, 22:04:03
Dobra, podsumuje się, bo się pogubiłem. Klasa statek ma wektor (tablicę) pocisków? [początkowo myślałem, że chodzi o kierunek w jakim pocisk leci]

Nie
Jest Klasa Statek oraz klasa Pocisk. Zostały stworzone wektory zawierające informacje o kilku obiektach

Cytuj
Statek wie o istnieniu pocisków (bo je tworzy), sam Pocisk nie musi się interesować statkiem. Do sprawdzania kolizji służy osobna klasa.
No ale dobra, przejdę trochę bardziej do sedna, co prawda trochę można by tu poprawić, ale nie jest chyba źle ;-)

Do sprawdzania kolizji nie służy oddzielna klasa. Pociski sprawdzają czy kogoś trafiły.

@Kos
Jednak nie działa  :D
Ta klasa, która ma zincludeowany nagłówek drugiej klasy działa w porządku, ale ta z Class Klasa; nie działa

Offline nilphilus

  • Użytkownik
    • wordpress

# Maj 03, 2010, 22:08:29
"Do sprawdzania kolizji nie służy oddzielna klasa. Pociski sprawdzają czy kogoś trafiły."
I dlatego jest tak jak jest, nagle pocisk staje się klasą niemal, że główną bo wszystko od niego zależy.

No to nawet lepiej. Statek ma tylko metody tworzące pociski, wciska je - dalej utrzymuje, że lepiej jak wydzielisz sobie klasę sprawdzającą kolizje, bo inaczej optymalizacje będą koszmarem - albo w sumie, nie będą możliwe.

Przemyśl sobie co za co ma być odpowiedzialne. ;->

Offline .S.

  • Użytkownik

# Maj 03, 2010, 22:24:04
ARGH!
Ostatni błąd. Potem już ruszy  ;D

W Klasie Statek jedna z metod używa funkcji DodajPociskGracza(); i przekazuje siebie oraz wektor pocisków. Funkcja ta jest w main.cpp, ale znowu pojawił się problem "identifier not found"

wygląda to mniej więcej tak

Statek.cpp

RuchGracza("wektor pocisków")
    DodajPociskGracza(this, "wektor pocisków");

ocb?