【发布时间】:2021-02-15 01:24:48
【问题描述】:
我正在尝试我的第一个更大的 C++ 对象,但在使用共享指针实现单例时遇到了一些问题。
当我尝试编译以下内容时,Visual Studio 给了我这个错误:
“错误 C2248 'PaletteManager::PaletteManager': 无法访问私有 在类“PaletteManager”中声明的成员 {省略}\xmemory 第 228 行“
我猜这个问题是因为我有一个私有构造函数/析构函数,而 make_shared 正试图调用构造函数。这个访问问题对我来说很有意义,但是如果我想使用共享指针作为访问我的单例对象的方式,我应该怎么做?代码在原始指针上工作得很好,但我想尝试用智能指针以干净的方式做事。
这里是相关代码的头文件:
class PaletteManager
{
private:
// array representing palette colors
uint* paletteColors;
// private constructor/destructor because singleton
PaletteManager();
~PaletteManager();
// load palette from file TODO: not implemented
void loadPallette();
static std::shared_ptr<PaletteManager> instance;
public:
const uint PALETTE_MAX_COLORS = 4;
uint getPaletteColor(uint idx);
// singleton accessor
static std::shared_ptr<PaletteManager> getInstance();
};
这是 cpp 文件中的问题函数:
std::shared_ptr<PaletteManager> PaletteManager::instance = nullptr;
std::shared_ptr<PaletteManager> PaletteManager::getInstance()
{
if (!PaletteManager::instance)
{
PaletteManager::instance = std::make_shared<PaletteManager>();
}
return PaletteManager::instance;
}
【问题讨论】: