在指针 class 中引用虚函数时出现段错误
segfault when referencing virtual function within pointer class
这个程序是一个游戏,其中一个动态二维阵列板充满了空间 classes。每个房间 class 都有一个私有指针事件 class,它将继承四个不同子 classes 之一。我的目标是在每个子 class 中使用事件 class 的虚函数,这样我就可以在事件中调用一个纯虚函数,该事件 return 来自继承子 [=18] 的字符串=].不过,我遇到了段错误。这是我的简化代码:
//in game class
board[1][1].set_bat();
board[1][1].get_message();
//room.h
class room {
private:
event *ev; //here, each room class is given an event class pointer
public:
void set_bat();
void get_message();
};
//in room.cpp
void room::set_bat(){ //here, the event pointer is set to one of its child classes.
bats x;
ev = &x;
//ev->message(); if the message func is called here, it return "bats" correctly,
}
void room::get_message(){ //calling this, is where the error occurs
ev->message();
}
//in event.h
class event {
public:
virtual void message() = 0;
};
//in bats.h
class bats: public event{
public:
void message();
};
//in bats.cpp
void bats::message(){
cout<<"bats"<<endl;
}
最终目标是每当我在游戏 class 中调用 get_message 时,它都会 return 来自虚拟函数的字符串,即使房间内的事件是对于不同的东西,比如坑,它会 return 字符串 "pit"。
在:
void room::set_bat(){ //here, the event pointer is set to one of its child classes.
bats x;
ev = &x;
//ev->message(); if the message func is called here, it return "bats" correctly,
}
您正在返回一个指向局部变量的指针。当函数 returns 时,此变量超出范围,因此 ev
现在指向垃圾。
您应该使用 new
来分配指针:
void room::set_bat(){
ev = new bats();
}
这也意味着您应该为 room
class 定义一个调用 delete ev
:
的析构函数
class room {
private:
event *ev; //here, each room class is given an event class pointer
public:
void set_bat();
void get_message();
~room() { delete ev; } // ADDED
};
这个程序是一个游戏,其中一个动态二维阵列板充满了空间 classes。每个房间 class 都有一个私有指针事件 class,它将继承四个不同子 classes 之一。我的目标是在每个子 class 中使用事件 class 的虚函数,这样我就可以在事件中调用一个纯虚函数,该事件 return 来自继承子 [=18] 的字符串=].不过,我遇到了段错误。这是我的简化代码:
//in game class
board[1][1].set_bat();
board[1][1].get_message();
//room.h
class room {
private:
event *ev; //here, each room class is given an event class pointer
public:
void set_bat();
void get_message();
};
//in room.cpp
void room::set_bat(){ //here, the event pointer is set to one of its child classes.
bats x;
ev = &x;
//ev->message(); if the message func is called here, it return "bats" correctly,
}
void room::get_message(){ //calling this, is where the error occurs
ev->message();
}
//in event.h
class event {
public:
virtual void message() = 0;
};
//in bats.h
class bats: public event{
public:
void message();
};
//in bats.cpp
void bats::message(){
cout<<"bats"<<endl;
}
最终目标是每当我在游戏 class 中调用 get_message 时,它都会 return 来自虚拟函数的字符串,即使房间内的事件是对于不同的东西,比如坑,它会 return 字符串 "pit"。
在:
void room::set_bat(){ //here, the event pointer is set to one of its child classes.
bats x;
ev = &x;
//ev->message(); if the message func is called here, it return "bats" correctly,
}
您正在返回一个指向局部变量的指针。当函数 returns 时,此变量超出范围,因此 ev
现在指向垃圾。
您应该使用 new
来分配指针:
void room::set_bat(){
ev = new bats();
}
这也意味着您应该为 room
class 定义一个调用 delete ev
:
class room {
private:
event *ev; //here, each room class is given an event class pointer
public:
void set_bat();
void get_message();
~room() { delete ev; } // ADDED
};