2013-07-20 13 views
5

Mój program zawiera klasę, oto jego uproszczona forma:Wywołanie funkcji obiektu poprzez wskaźniki obiektów

Units.h:

#define fullwidth 200 
#define fullheight 200 

class Units 
{ 
public: 

[...] 

void MovingUp(Units* Detector[fullwidth][fullheight], Units Self); 
[...] 
} 

To definiuje funkcję, która pobiera dwa argumenty jako wejście: tablica obiektu wskaźniki dla obiektów "Jednostki" i specjalny wybrany obiekt "Jednostki".

Oto główne części:

#include "Units.h" 

[...] 

int i,j; 
Units* DetectorField[fullwidth][fullheight]; 
Units Examples[20]; 

for (j=0;j<fullheight;j++) 
{ 
    for (i=0;i<fullwidth;i++) 
    { 
     DetectorField[i][j] = NULL; 
    } 
} 

Tworzy tablicę „jednostki” wskaźniki obiektu, który jest niezbędny do funkcjonowania w „jednostkach” i ustawia wszystkie te wartości NULL na samym początku.

Po tym, próbuję wywołać funkcję obiektu przez jeden losowo wybrany wskaźnik. Oczywiście, jeśli wskaźnik jest odwoływany do wartości NULL, wywołanie jest niemożliwe, ale program Visual C++ pokazuje błąd nawet przed uruchomieniem programu.

DetectorField[12][12]->MovingUp(DetectorField,DetectorField[12][12]); 

Dla tej wersji Visual C++ pisze po kompilacji: nie można konwertować parametru 2 z „Jednostki *” do „Jednostki” - oczywiście, ponieważ sama DetectorField jest tablicą wskaźników. Wtedy staram się odwołać do obiektu to punkty, w ten sposób:

DetectorField[12][12]->MovingUp(DetectorField,&DetectorField[12][12]); 

MSVC pisze po kompilacji: nie można konwertować parametru 2 z „Jednostek **” do „Jednostki”

Nie jest jasne dla mnie, dlaczego druga wersja odwołuje się do wskaźnika wskaźnika obiektu, a nie do obiektu. Ponadto, w jaki sposób powinienem napisać wywołanie funkcji we właściwy sposób?

+2

DetectorField [12] [12] jest wskaźnikiem. So & DetectorField [12] [12] jest odniesieniem do wskaźnika. Aby uzyskać obiekt, odłóż wskaźnik za pomocą *. Wypróbuj DetectorField [12] [12] -> MovingUp (DetectorField, * DetectorField [12] [12]); (Po prostu odpowiadam na to pytanie i nie zwracam uwagi na pytania takie, jak pamięć została przydzielona, ​​dlaczego nie używać inteligentnych wskaźników, wektorów itp.) –

+0

Jestem trochę amatorka w używaniu wskaźników. Podstawowe rzeczy są dla mnie w porządku, ale wskaźniki i wiele operacji związanych z obsługą pamięci to trochę za dużo dla mojego mózgu. Mam nadzieję, że mogę się uczyć. Dzięki! –

+1

BTW - +1 za bardzo jasne, czego nie rozumiesz i jakie jest twoje pytanie. –

Odpowiedz

1

"Nie jest dla mnie jasne, dlaczego druga wersja odnosi się do wskaźnika obiektu, a nie do obiektu."

Po wyświetleniu & oznacza to the address of.

"Ponadto, w jaki sposób powinienem napisać wywołanie funkcji we właściwy sposób?"

Co należy zrobić, albo nazywają go w ten sposób:

DetectorField[12][12]->MovingUp(DetectorField,*DetectorField[12][12]); 
              ^

Co oznacza wartość wskazanych przez DetectorField [12] [12] (ponieważ jest to wskaźniki array).

Albo zmienić decleration funciton do:

void MovingUp(Units* Detector[fullwidth][fullheight], Units* Self); 
                 ^

co oznacza ta funkcja recive wskaźnik do jednostek.

+0

Cóż, to ma całkowicie sens - po prostu nie wiedziałem, że jest to ważna operacja, ponieważ nie widziałem w ten sposób używania operatora '*'. Dziękuję Ci! –

+2

tak, notacja jest myląca na samym początku. Powodzenia! –

1

Typ elementu w tablicy to Units*. Zadeklarowałeś to w ten sposób: Units* Detector[fullwidth][fullheight] - dwuwymiarowa tablica z Units*. Adres Units* jest typu Units**.

2

dla tego połączenia ważność:

DetectorField[12][12]->MovingUp(DetectorField, DetectorField[12][12]); 

Drugi argument musi być Unit * typu takich jak:

class Unit 
{ 
    // ... 
    void MovingUp(Units* Detector[fullwidth][fullheight], Units *Self); 
}; 

Jeśli chcesz zachować Unit::MovingUp a następnie zmienić swoje wezwanie do:

DetectorField[12][12]->MovingUp(DetectorField, *DetectorField[12][12]); 

Pamiętaj, że podajesz tutaj jednostkę według wartości. Jeśli posiadasz inne klasy dziedziczące z jednostki, ryzykujesz cięcie obiektów. Proponuję przynajmniej zmienić go, aby uzyskać odniesienie Unit &.

+0

Rzeczywiście, "Jednostki" już odziedziczyły klasy, dzięki za wzmiankę o tym! Czy możesz wyjaśnić, co mam zmienić? 'void MovingUp (Units & Detector' zamiast' void MovingUp (Units * Detector'? –

Powiązane problemy