Чистый вызов виртуальной функции R6025 (класс, производный от sf :: InputStream)

Для моей игры я хочу использовать PhysF для извлечения музыкальных файлов, которые находятся в zip-файле

Я создал собственный класс MusicStream что наследует от sf::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дтор ??), но я реализовал все 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());

Я поменял их местами и избавился от ошибки. Это потому, что музыка играет в своей собственной теме. Он попытался прочитать из потока после того, как он был уничтожен. Теперь музыка уничтожается раньше, чем поток.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]