2016-05-12 4 views
1

Ich versuche, ein SDL-Minispiel zu machen, und ich habe ein Problem, wenn ich versuche, einen Vektorzeiger aus einer anderen Klasse aufzurufen. Das Problem ist, dass das Ergebnis ein leerer Vektor ist, wenn ich die Funktion aufruft.C++ Aufruf an (Vektor-) Zeiger von einer anderen Klasse Rückgabe leere Größe

In dieser Klasse I

jeden Rahmen drawBoss nennen
class badBoss { 
public: 

    struct fire { 
     int type, x, y; 
     float v, vx, vy; 
     int angle; 
    }; 
    std::vector<fire> vFire; 
    std::vector<fire> *pvFire = &vFire; 


    void drawBoss(SDL_Renderer *ren) { 
     vFire.push_back(fire({0,cP1.x+20,cP1.y,cP1.w,cP1.h,v})); 
    } 

};

In dieser Klasse versuche ich vFire Zeiger zu erfassen, aber die Größe ist immer 0.

class colision { 


public: 
    badBoss _boss; 

    void detectColision() { 

     std::vector<badBoss::fire> lala = *_boss.pvFire; 
     std::cout << lala.size() << std::endl; 

    } 

};

dies ist der Haupt meines Spiels

int main() { 
    colision _colision; 
    bool aktibo = true; 

    while(aktibo) { 

     _badBoss.drawBoss(ren); 
     _colision.detectColision();  

    } 

    return 0; 
} 

Wie kann ich richtig den Wert des Zeigers bekommen?

EDIT: Dank Ihrer Vorschläge konnte ich es beheben. Das war das Problem: In der Kollisionsklasse machte ich eine neue Instanz auf BadBoss, und natürlich, wenn ein Aufruf zu vFire Vektor immer 0 war.

Jetzt rufe ich zu Kollision von der Hauptfunktion mit der richtigen Instanz wie parametre und .... walllaaa !! Alles läuft perfekt!

+1

Warum haben Sie den Vektor und einen Zeiger auf den Vektor als öffentliche Membervariablen? Haben Sie versucht, auf den Vektor zuzugreifen, indem Sie direkt in 'detectCollision()' auf den Vektor zugreifen? – user463035818

+1

Ein mögliches Szenario ist, dass die 'BadBoss' -Instanz, auf die Sie in' _boss.pvFire' zugreifen, nicht die gleiche ist wie die, die Sie 'drawBoss' nennen. – molbdnilo

+0

hi @ tobi303, ich bin neu in C++. Ich habe die zwei Variablen wie öffentlich, weil ich auf sie von anderer Klasse zugreifen möchte. Und ich versuche auch direkt aus der Kollisionsklasse auf sie zuzugreifen, ist aber nicht dieselbe Variable. Es ist immer leer –

Antwort

1

@ molbdnilo hat einen guten Punkt. Sie sollten einen Konstruktor (oder einen Setter) in der Kolisionsklasse hinzufügen, der das _boss-Objekt initialisiert. d. h.

colision(badBoss boss) { 
_boss = boss; 
} 
+0

Hallo @asif !! BINGO !! Das war das Problem !!! In der Kollisionsklasse war ich initial ein neues statt badBoss und natürlich war vFire immer 0. Danke für alles !! ;-) –

0

In meiner bescheidenen Meinung nach ist es eine Frage der Vektor Zeiger Initialisierung:

class badBoss { 
public: 

    struct fire { 
     int type, x, y; 
     float v, vx, vy; 
     int angle; 
    }; 
    std::vector<fire> *vFire = new std::vector<fire>(); 
    // I don't think it's even needed 
    //std::vector<fire> *pvFire = &vFire; 


    void drawBoss(SDL_Renderer *ren) { 
     // Isn't one value missing? 
     vFire->push_back(fire({0,cP1.x+20,cP1.y,cP1.w,cP1.h,v})); 
    } 
}; 

Und nun, für die Kollisionsdaten

class collision { 

public: 
    void detectCollision() { 
     std::cout << _boss.vFire->size() << std::endl; 

    } 
}; 

hoffe, das hilft! Referenz: Pointer to a Vector

+0

danke für die Antwort @Alfonso. Dein Code läuft perfekt, aber ich habe das gleiche Problem. Wenn ich std :: cout < size() << std :: endl; in der DrawBoss-Funktion ist alles gut, aber wenn ich std :: cout << _boss mache.vFire-> size() << std :: endl; In detectCollision ist die Größe des Vektors leer. (Wenn Sie möchten, ich habe den vollständigen Code in GitHub) –

+0

Sicher, kann ich den Link für den gesamten Code überprüfen? –

+0

Take it easy Alfonso, es ist nur ein Hobby. Ist nicht meine Arbeit ;-) https://github.com/perikobermio/xfighter.git –