Abstrakte Objekte

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Abstrakte Objekte

    Weil ich für mein PC-Spiel, einen Spaceshooter
    Spiel
    DirectX Update
    auch Verbündete einführen wollte habe ich die Für die AI aus meiner bisherigen Gegner-Implementation eine Abstrakte Klasse herausgelöst.
    Funktioniert aber nicht ganz


    Enemy.h

    Quellcode

    1. #ifndef ENEMY_H
    2. #define ENEMY_H
    3. //std - Include
    4. #include <string>
    5. #include <list>
    6. #include <stdio.h>
    7. //projekt - include
    8. #include "NPC.h"
    9. #include "Console.h"
    10. #include "Player.h"
    11. class CEnemy :
    12. public ANPC
    13. {
    14. private:
    15. std::string m_powerupfile;
    16. CPlayer* m_player;
    17. void number_enemys(int* results, std::list<CEnemy*>& r_active_my_enemys);
    18. bool calculate_y(float* down_up);
    19. public:
    20. CEnemy(unsigned int starttime, int posx, int posy, Strength theStrength, std::string shipfile, std::string powerupfile)
    21. : ANPC(starttime, posx, posy, theStrength, shipfile), m_powerupfile(powerupfile)
    22. {}
    23. std::string getPowerUp()
    24. {return m_powerupfile;}
    25. bool init(global_data_pointers Data, CPlayer* player, AI_parameter* parameter, strength* Strength)
    26. { m_player = player; return ANPC::init(Data, parameter, Strength);}
    27. ~CEnemy()
    28. {}
    29. };
    30. #endif
    Alles anzeigen


    NPC.h

    Quellcode

    1. #ifndef NPC_H
    2. #define NPC_H
    3. #include <bitset>
    4. #include "Ship.h"
    5. #include "Enemy_Help.hpp"
    6. #include "Globals.h"
    7. #include "MathFuncs.h"
    8. class ANPC
    9. {
    10. public:
    11. enum Strength {EMPTY, WEAK_ENEMY, MEDIUMWEAK_ENEMY, AVERAGE_ENEMY, MEDIUMHARD_ENEMY, HARD_ENEMY, WEAK_BOSS = 101, MEDIUMWEAK_BOSS = 102, AVERAGE_BOSS = 103, MEDIUMHARD_BOSS = 104, HARD_BOSS = 105};
    12. protected:
    13. int des_x, des_y;
    14. AI_parameter* m_parameter;
    15. int desired_distance;
    16. int desired_center;
    17. CShip* m_Ship;
    18. private:
    19. unsigned int m_starttime;
    20. int rest_x, rest_y;
    21. Strength m_strength;
    22. int m_firedist;
    23. std::string m_shipfile;
    24. protected:
    25. float get_fancy(float* farray, int start, int end);
    26. private:
    27. //////////
    28. //Virtuelle Funktionen
    29. //////////
    30. /*
    31. *result muss ein int [3] sein, Inhalt ist am Schluss die Zahl der jeweiligen Gegner in die Richtung
    32. *[0] für links [1] für mitte [2] für rechts
    33. */
    34. virtual void number_enemys(int* results, std::list<ANPC*>& r_Enemys) = 0;
    35. /*Berechnet, in welche Y-Richtung sich der NPC optimalerweise bewegt*/
    36. virtual bool calculate_y(float* down_up) = 0;
    37. //////////
    38. //Implementierte Funktionen
    39. //////////
    40. /*Bewegt das Schiff in y-Richtung, überprüft dabei ob die Wartezeit abgelaufen ist*/
    41. void steer_y(int direction);
    42. /*Bewegt das Schiff in x-Richtung, überprüft dabei ob die Wartezeit abgelaufen ist*/
    43. void steer_x(int direction);
    44. /*Berechnung der "beliebtheit" jedes Pixels für den NPC*/
    45. void update_array(float* fancy, std::list<projectileData>& r_Projectiles);
    46. /*Diese Funktion sorgt dafür, dass die NPC einen minimalabstand halten*/
    47. void separation(std::list<ANPC*>& r_activeEnemys, float* xseparate, float* yseparate);
    48. /*Berechnet, in welche X-Richtung sich der NPC optimalerweise bewegt*/
    49. bool calculate_x(float* fancy, float* fancy_dir, std::list<projectileData>& r_Projectiles, std::list<ANPC*>& r_activeEnemys);
    50. public:
    51. //Konstruktor/Destruktor usw.
    52. ANPC(unsigned int starttime, int posx, int posy, Strength theStrength, std::string shipfile);
    53. ~ANPC()
    54. {if (m_Ship) delete m_Ship;}
    55. bool init(global_data_pointers Data, AI_parameter* parameter, strength* tStrength);
    56. //Berechnungsfunktionen
    57. /*Berechnung der Bewegungsrichtung des NPC, wird seltener aufgerufen als update()*/
    58. void calculate(float* fancy, std::list<projectileData>& r_Projectiles, std::list<ANPC*>& r_activeEnemys);
    59. /*Führt jeden Frame die in calculate berechnete Bewegung durch, schießt bei Bedarf*/
    60. void update(const std::bitset<800>& owned);
    61. void Draw()
    62. {m_Ship->Draw();}
    63. //Elementzugriff
    64. CShip* getShip()
    65. {return m_Ship;}
    66. unsigned int getStarttime()
    67. {return m_starttime;}
    68. int getPower()
    69. {return (m_strength > 100) ? m_parameter->max_power : 1;}
    70. int getStrength()
    71. {return m_strength;}
    72. };
    73. #endif
    Alles anzeigen


    "MS Visual C++ 6" schrieb:


    P:\Spaceshooter\10-11-06(VC6)\EnemyManager.cpp(643) : error C2259: "CEnemy" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
    P:\Spaceshooter\10-11-06(VC6)\Enemy.h(20) : Siehe Deklaration von 'CEnemy'
    P:\Spaceshooter\10-11-06(VC6)\EnemyManager.cpp(643) : error C2259: "CEnemy" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
    P:\Spaceshooter\10-11-06(VC6)\Enemy.h(20) : Siehe Deklaration von 'CEnemy'


    ____________________________________________________________

    OK scheinbar kann ich den Konstruktor einer Basisklasse nicht aufrufen, wenn diese rein virtuelle Funktionen hat -.-

    ____________________________________________________________

    Kennt jemand eine Möglichkeit einen Konstruktor für die Basisklasse zu verwenden und trotzdem sicherzustellen, dass eine Funktion in der Basisklasse die entsprechende Funktion der abgeleiteten Klasse aufruft?

    Ich hab bei den Funktionen das =0 entfernt, danach lies es sich wunderbar Compilieren aber die Funktion der Basisklasse, die die Virtuelle Funktion aufruft nimmt die der Basisklasse
  • Nach meinem Stroustrup müsste das so funktionieren wie das mom programmiert ist?
    Jedenfalls versteh ich das so.

    Liegt das Problem
    a) an der VC6
    b) daran, dass ich die Funktion aus der Basisklasse heraus aufrufe
    c) daran, dass die funktion über einen Pointer auf einen CEnemy aufgerufen wird, dieser aber den Typ ANPC* hat
    d) Ich hab das falsch verstanden


    __________________________________________

    Es war
    e) Die Funktionen hatten verschiedene Parameter