这个程序是一个游戏,其中一个动态的二维阵列板充满了房间类。每个房间类都有一个私有指针事件类,它将继承四个不同子类中的一个。我的目标是让虚函数成为每个子类中的事件类,这样我就可以在事件中调用纯虚函数,该函数将从继承的子类返回一个字符串。我虽然得到了一个段错误错误。这是我的简化代码:
-(void)awakeFromNib{
[super awakeFromNib];
NSString *fname = [[NSBundle mainBundle] pathForResource:@"TestImage" ofType:@"dat"];
NSError *err = nil;
if(!fname){
err = [NSError errorWithDomain:@"ViewController" code:0
userInfo:@{NSLocalizedFailureReasonErrorKey:@"No selected data file!"}];
}else{
_rawDataFromFile = [NSData dataWithContentsOfFile:fname
options:NSDataReadingMappedIfSafe | NSDataReadingUncached
error:&err];
}
if(err){
[self presentError:err];
return;
}
[self.imageView setFillMode:kGPUImageFillModePreserveAspectRatio];
[self.imageView setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0];
GLubyte* data = (GLubyte *)[self.rawDataFromFile bytes];
_inputFilter = [[GPUImageRawDataInput alloc] initWithBytes:data
size:CGSizeMake(1024, 241)
pixelFormat:GPUPixelFormatLuminance
type:GPUPixelTypeUByte];
[self.inputFilter addTarget:self.imageView];
}
- (IBAction)updateAction:(id)sender {
if (_inputFilter) {
[self.inputFilter useNextFrameForImageCapture];
[self.inputFilter processData];
}
}
最终目标是每当我在游戏类中调用get_message时,它会从虚函数中返回字符串,即使房间内的事件是针对某些不同的事件(例如坑),也会返回字符串"坑&#34 ;.
答案 0 :(得分:0)
在:
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,
}
您正在返回指向局部变量的指针。当函数返回时,此变量超出范围,因此ev
现在指向垃圾
您应该使用new
来分配指针:
void room::set_bat(){
ev = new bats();
}
这也意味着您应该为调用room
的{{1}}类定义析构函数:
delete ev