gpt4 book ai didi

C++单例模板类继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:36 25 4
gpt4 key购买 nike

我有一个抽象的单例类。我的目标是任何子类只需要实现 init() 函数而不是其他任何东西。这是我所做的:

template <typename T>
class Singleton
{
public:

Singleton()
{
init();
}

static T& instance()
{
static T instance;
return instance;
}

protected:
virtual void init() = 0;
};

class SubSingleton : public Singleton<SubSingleton>
{
protected:
void init()
{
cout << "Init SubSingleton" << endl;
}
};

这不会编译,因为 init() 是 protected ,不能从公共(public)静态函数调用。这个问题有2个解决方案。首先我们可以公开 init() 函数,但我不想公开这个函数。所以这就只剩第二种方案了,修改子类如下:

class SubSingleton : public Singleton<SubSingleton>
{
friend class Singleton<SubSingleton>;

protected:

void init()
{
cout << "Init SubSingleton" << endl;
}
};

这很完美,但我不想要 friend 语句,因为其他程序员可能会扩展我的代码并且可能不知道应该添加它。

如果没有 friend 语句,还有其他实现方法吗?也许来自 Andrei Alexandrescu 的任何东西?

编辑:现在在构造函数中调用 init 函数而不是 instance() 函数。

EDIT2:出于技术原因和兼容性,我需要一个 init() 函数,不能只在构造函数中进行初始化。

转换的解决方案有效,但如果我从构造函数调用 init(),则转换不再起作用。有什么建议吗?

最佳答案

你根本不需要这个 init() 东西。它只会在这里制造问题。

template <typename T>
class Singleton
{
public:
static T& instance()
{
static T instance;
return instance;
}
};

class SubSingleton : public Singleton<SubSingleton>
{
public:
SubSingleton()
{
cout << "Init SubSingleton" << endl;
}
};

通过这种方式,您不仅可以删除不必要的东西——而且还可以防止每次有人调用 instanse() 时都调用 init()...

关于C++单例模板类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11381805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com