2010-05-07 35 views
0

我有一个级别类和一个Enemy_control类,它基于一个将Enemys作为值的向量。 在我的水平构造我:向类构造函数中的向量添加值时的变量范围

Enemy tmp(1200); 
enemys.Add_enemy(tmp); // this adds tmp to the vector in Enemy_control 

敌人是类型Enemy_control的变量。我的程序在这些陈述中抱怨关卡中的一些析构问题以及enemy_control和enemy后崩溃。

Level1::Level1() : Levels() 
{ 
bgX1 = -60; // -60 
bgX2 = -130; // -110 
bgX3 = -240; // - 
bgY=0; // is this used anymore? 

// characterY=330; 
max_right_movement=500; 
max_left_movement=300; 

// More test 
jump_max = 110; 
player_current_y = 340; 
jump_spd = 4; 
player_current_floor_y = 340; 
//CONST_LEVEL1_MAIN_Y = new int(340); 

scrolling = true; 
scrolling_right = true; // this var is in levels 

level_alive = true; 
restart_level = false; 

player_level_x = 300; 
player_screen_x = 300; 

level_end_point = 1035 * 10; 
level_start_point = 0; 

// create enemys in the level 
Enemy tmp(1200); 
enemys.Add_enemy(tmp); 


// tmp.Set_enemy(4600); 
// enemys.Add_enemy(tmp); 
scoreTitle = new MyText(25); 
score = new MyText(25); 
high_score=0; 
//onblock=0; 

load("grafx/level1/clouds.png", "grafx/level1/mountain.png", "grafx/level1/ground.png", "sounds/level1music.ogg"); 
} 

and enemy.h: 

/* Enemy.h 
* obg 
* 1-13-10 
*/ 

#ifndef ENEMY_H 
#define ENEMY_H 

#include "Character.h" 
#include <vector> 

class Enemy : public Character 
{ 
    private: 
     int enemy_speed, 
      DRAW_X, 
      spawn_x, 
      distance_to_enemy, 
      frame_left, 
      frame_right, 
      death_frame_x, 
      death_frame_y; 

     int bullet_fire_rate; 

     bool following_player; 

    private: 
     void Draw_enemy_going_right(SDL_Surface *video_surface); 
     void Draw_enemy_going_left(SDL_Surface *video_surface); 
     void Draw_death(int bgX3, int y, SDL_Surface *video_surface); 

     void Move_frame_left(); 
     void Move_frame_right(); 

     void Draw_me(int bgX3, int y, SDL_Surface *video_surface, int player_level_x, int player_screen_x); 

     void Fire_bullet(); 

    public: 
     Enemy(int spawn_x); 
     ~Enemy(); 

     //void Set_enemy(int spawn_x); 
     void Draw(int bgX3, int y, SDL_Surface *video_surface, int player_level_x, int player_screen_x); 
     bool Following_player(); 

}; 

class Enemy_control 
{ 
    private: 
     vector<Enemy> enemy_vector; // change this to a vector 

    public: 
     Enemy_control(); 
     ~Enemy_control(); 

     void Add_enemy(Enemy a_enemy); 
     void Draw(int bgX3, int y, SDL_Surface *video_surface, int player_level_x, int player_screen_x); 
     //void Free_list_from_memory(); 
}; 

敌人构造:

敌人::敌人(INT spawn_x):字符() {

character_image.load( “GRAFX/enemy1.gif”);

health = 400; 
damage = 20; 

DRAW_X = spawn_x; 
this->spawn_x = spawn_x; 

distance_to_enemy = 230; 
enemy_speed = 3; 
frame_left = 0; 
frame_right = 0; 
death_frame_x = 390; 
death_frame_y = 0; 

following_player = false; 
bullet_fire_rate = 0; 

sprite_info.w = 63; 
sprite_info.h = 74; 
cout << "enemy built please call Set_enemy()\n"; 

}

任何想法?

+1

小心发布实际的错误,而不是说它是“一些析构问题”?我们不是心灵的。 – rlbond 2010-05-08 00:32:06

+0

字符标题的外观如何,你是否声明析构函数是虚拟的? – 2010-05-08 00:53:57

+0

@Anders Karlsson是 – TheFuzz 2010-05-08 00:59:53

回答

0

正如alread指出,你的问题的描述不是很精确。让我感到奇怪的事情之一是为什么你的任何类的析构函数被调用。看看你的代码,很明显,Enemy tmp是一个本地实例,它在离开Level构造函数后得到清理。 Add_Enemy()函数接收此本地对象的副本。由于您没有提供复制构造函数,所以在复制构造函数中不会执行对character_image.load("grafx/enemy1.gif");的调用,因此您存储的Enemy对象将没有图像。

也许你应该考虑这样的事情:

Enemy* tmp = new Enemy(1200); // dynamic allocation of Enemy 
enemey.Add_enemy(tmp);  

如果您做些事情是这样,你需要你的载体改变存储指向敌人的对象 像std::vector< Enemy* >敌人。不要忘记在Enemy_control的析构函数中删除动态分配的对象。