如何在基类中将默认构造函数设为私有?

Posted

技术标签:

【中文标题】如何在基类中将默认构造函数设为私有?【英文标题】:How to make default constructor private in base class? 【发布时间】:2020-04-28 13:59:29 【问题描述】:

我想有一个类,当我们从它继承时,它可以使其他类成为单例,所以我写了这个:

template <typename Class,
     typename T = std::enable_if<std::is_class_v<Class>>>
struct singleton

public:
    static Class* get_instance(void)
    
        if (!object)
        
            object = new Class;
        
        return object;
    

protected:
    static Class* object;
    singleton(void) = default;

private:
    singleton(const singleton&) = delete;
    singleton& operator=(const singleton&) = delete;
;
template <typename Class, typename T>
Class* singleton<Class, T>::objectnullptr;

这就是我使用它的方式:

struct some_base_class : public singleton<some_base_class>

private:
    size_t m_variable;

public:
    static auto make(const size_t var)
    
        auto osingleton<some_base_class>::get_instance();
        o->m_variable = var;

        return o;
    
;

但这里some_base_class 不是单例,因为在singleton 类中,我们将默认构造函数设为受保护成员,我试图将其设为私有成员,但出现此错误:

use of deleted function ‘some_base_class::some_base_class()’

为什么?我只是将其设为基类中的私有成员并将其标记为= default 而不是= delete!。

【问题讨论】:

【参考方案1】:

如何在基类中将默认构造函数设为私有?

您可以使用访问说明符:

struct base 
private:  // this here
    base() = default;

我收到了这个错误:

 use of deleted function ‘some_base_class::some_base_class()’

为什么?

因为你试图默认初始化派生类。

并且由于基类的默认构造函数是私有的,因此派生类型的隐式生成的构造函数被删除。这是因为无法访问构造函数,因此无法构造基础。

【讨论】:

所以这意味着我可以拥有一个单例基类并使用它来使其他类单例继承该基类? @GhasemRamezani 不,你不能有这样的基类。【参考方案2】:

看起来这个错误是指你的参数化构造函数 已标记删除... 如果可以,请使用类而不是结构,因为默认情况下,如果您不指定它们为公共或受保护的所有成员都是私有的......

【讨论】:

以上是关于如何在基类中将默认构造函数设为私有?的主要内容,如果未能解决你的问题,请参考以下文章

调用派生类的构造函数在基类的构造函数之前执行

C#的构造函数在基类和父类中执行顺序

如何在基类构造函数中使用派生类成员

为啥在基类构造函数中看不到派生类属性值?

如何在构造函数中注入 IEnumerable<ICustomRepository>,以便我可以决定在基类中使用哪一个?

派生类在基类中删除时是不是会有隐式复制构造函数或赋值运算符?