0

受到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();
}

}

任何想法都将不胜感激,这让我挠头了一段时间!

4

0 回答 0