受到GoTW 101的启发,我决定尝试将 Pimpl 习语应用到我正在使用那里描述的 pimpl 包装器的库的一部分。
但是,在尝试编译时,我得到了对该 Pimpl 类的析构函数的未定义引用。这只发生在 clang 上并且只在Linux 上发生。即,Linux 上的 GCC 和 OSX 上的 Clang 工作正常。
这是不起作用的代码:
头文件
#ifndef TANK_MUSIC_HPP
#define TANK_MUSIC_HPP
#include <string>
#include "../Utility/Pimpl.hpp"
namespace tank
{
class Music
{
struct impl;
Pimpl<impl> data;
public:
Music(std::string fileName);
//~Music();
bool load(std::string fileName);
void play();
void pause();
void stop();
};
}
#endif //TANK_MUSIC_HPP
源文件
#include "Music.hpp"
#include "../System/Game.hpp"
#include <SFML/Audio/Music.hpp>
#include "../Utility/Pimpl_impl.hpp"
namespace tank
{
struct Music::impl {
sf::Music music;
bool loaded = false;
};
Music::Music (std::string fileName)
{
load(fileName);
}
//Removing this comment works, but this shouldn't be necessary should it?
//Music::~Music() = default;
bool Music::load (std::string fileName)
{
if (data->loaded)
{
Game::log << "Music already loaded!" << std::endl;
return data->loaded;
}
data->loaded = data->music.openFromFile(fileName);
return data->loaded;
}
void Music::play()
{
data->music.play();
}
void Music::pause()
{
data->music.pause();
}
void Music::stop()
{
data->music.stop();
}
}
任何想法都将不胜感激,这让我挠头了一段时间!