2015-12-14 112 views
0

对于我的比赛,我想用PhysFs提取是在一个zip文件R6025纯虚函数调用(从旧金山派生类::的InputStream)

我创建了一个自定义类MusicStreamsf::InputStream继承的音乐文件我用作sf::Music的流。

这是我的基本程序:

#include <SFML/Graphics.hpp> 
#include <SFML/Audio.hpp> 
#include "musicstream.h" 
#include "physfs.h" 

int main() { 
    PHYSFS_init(0); 
    PHYSFS_addToSearchPath("data.zip", 0); 

    std::string musicFile = "music.ogg"; 
    if (PHYSFS_exists(musicFile.c_str()) == 0) { 
    PHYSFS_deinit(); 
    return EXIT_FAILURE; 
    } 

    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); 
    sf::Music myMusic; 
    MusicStream myStream(musicFile.c_str()); 
    if (!myStream.getError()) { 
    myMusic.openFromStream(myStream); 
    myMusic.play(); 
    } 
    while (window.isOpen()) { 
    sf::Event event; 
    while (window.pollEvent(event)) { 
     if (event.type == sf::Event::Closed) window.close(); 
    } 
    } 

    myMusic.stop(); 

    PHYSFS_deinit(); 
    return 0; 
} 

这完美的作品,除了一两件事:

当我关闭窗口,退出程序,我得到一个运行时错误R6025 pure virtual function call和程序崩溃。

所以显然纯粹的虚函数被称为(sf::InputStream's dtor ??),但我实现了sf::InputStream的所有功能,这对我来说没有任何意义。

而且,我真的不知道,如果代码是相关的,但如果它是,这是自定义类:

musicstream.h

#ifndef MUSIC_STREAM_H_INCLUDED 
#define MUSIC_STREAM_H_INCLUDED 

#include <SFML/System.hpp> 
#include "physfs.h" 

class MusicStream : public sf::InputStream { 
public: 
    MusicStream(); 
    MusicStream(const char *fileName); 
    virtual ~MusicStream() override; 

    sf::Int64 read(void *data, sf::Int64) override; 
    sf::Int64 seek(sf::Int64 position) override; 
    sf::Int64 tell() override; 
    sf::Int64 getSize() override; 

    bool getError() const; 

private: 
    PHYSFS_File *file_; 
    bool error_; 

}; 

#endif 

musicstream.cpp

#include "musicstream.h" 

MusicStream::MusicStream() : 
    error_(true) 
{ 
} 

MusicStream::MusicStream(const char *filename) : 
    error_(false) 
{ 
    file_ = PHYSFS_openRead(filename); 
    if (file_ == nullptr) { 
    error_ = true; 
    } 
} 

MusicStream::~MusicStream() { 
    if (error_) { return; } 
    PHYSFS_close(file_); 
} 

sf::Int64 MusicStream::read(void *data, sf::Int64 size) { 
    if (error_) { return 0; } 
    sf::Int64 fileRead = PHYSFS_read(file_, data, 1, size); 
    if (fileRead == -1) { 
    return 0; 
    } 
    return fileRead; 
} 

sf::Int64 MusicStream::seek(sf::Int64 position) { 
    if (error_) { return -1; } 
    if (PHYSFS_seek(file_, position) == 0) { 
    return -1; 
    } 
    return position; 
} 

sf::Int64 MusicStream::tell() { 
    if (error_) { return -1; } 
    sf::Int64 position = PHYSFS_tell(file_); 
    return position; 
} 

sf::Int64 MusicStream::getSize() { 
    if (error_) { return -1; } 
    sf::Int64 size = PHYSFS_fileLength(file_); 
    return size; 
} 

bool MusicStream::getError() const { 
    return error_; 
} 

回答

0

的问题是这两条线:

sf::Music myMusic; 
MusicStream myStream(musicFile.c_str()); 

我交换了他们,摆脱了错误。这是因为音乐是在自己的线程中播放的。它在摧毁后试图从流中读取。现在音乐在流之前被破坏。