在指针类中引用虚函数时出现段错误

时间:2016-05-21 23:04:13

标签: c++ pointers inheritance polymorphism virtual-functions

这个程序是一个游戏,其中一个动态的二维阵列板充满了房间类。每个房间类都有一个私有指针事件类,它将继承四个不同子类中的一个。我的目标是让虚函数成为每个子类中的事件类,这样我就可以在事件中调用纯虚函数,该函数将从继承的子类返回一个字符串。我虽然得到了一个段错误错误。这是我的简化代码:

-(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 ;.

1 个答案:

答案 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