首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R6025纯虚函数调用(从sf::InputStream派生的类)

R6025纯虚函数调用(从sf::InputStream派生的类)
EN

Stack Overflow用户
提问于 2015-12-15 03:31:27
回答 1查看 138关注 0票数 0

对于我的游戏,我想使用PhysFs来提取zip文件中的音乐文件

我创建了一个继承自sf::InputStream的自定义类MusicStream,并将其用作sf::Music的流。

这是我的基本程序:

代码语言:javascript
复制
#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的dtor??),但是我实现了sf::InputStream的所有函数,这对我来说没有意义。

此外,我也不确定代码是否相关,但如果是相关的,这是自定义类:

musicstream.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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_;
}
EN

回答 1

Stack Overflow用户

发布于 2015-12-15 18:29:44

问题是这两行代码:

代码语言:javascript
复制
sf::Music myMusic;
MusicStream myStream(musicFile.c_str());

我交换了它们并摆脱了错误。这是因为音乐是在它自己的线程中播放的。在它被破坏后,它尝试从小溪中读取。现在音乐在小溪之前就被破坏了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34275125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档