首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板类:没有适当的默认构造函数可以获得。但是我的一些类不能有默认的构造函数。

模板类:没有适当的默认构造函数可以获得。但是我的一些类不能有默认的构造函数。
EN

Stack Overflow用户
提问于 2011-11-08 08:17:17
回答 3查看 1K关注 0票数 1

我遇到了一个奇怪的问题,在这个问题中,我需要一个默认的构造函数才能让我的模板类工作,但是我想在模板中使用的一些类不能有默认的构造函数。

我的意思是,某些类不能有默认构造函数,因为它们有一个const引用字段,因此必须在构造函数/初始化列表中设置它们。如果我有一个默认的构造函数,就没有什么可以设置这些引用。

因此,我想对此有两种可能的解决方案:有时在模板类中找到允许非默认构造函数的方法,或者找到在默认构造函数中设置const引用字段的方法。

我该怎么解决这个问题?

这里是我的模板代码:

代码语言:javascript
运行
复制
#pragma once

template<class T>
class Singleton
{
public:
    static T* getInstance()
    {
        if(!instance) instance = new T;
        return instance;
    }
static void setInstance(T* inst)
{
    instance = inst;
}
protected:
    Singleton();
    ~Singleton();
private:
    Singleton(Singleton const&);
    Singleton& operator=(Singleton const&);
    static T* instance;
};

template<class T> T* Singleton<T>::instance = 0;

这里是我设置const引用的地方(在.cpp中):

代码语言:javascript
运行
复制
InputHandler::InputHandler(const sf::Input& inputObject)
    : input(inputObject)
{

和输入在标头中定义:

代码语言:javascript
运行
复制
const sf::Input& input;

我必须使用常量引用,因为这个代码区域(在不同的文件中):

代码语言:javascript
运行
复制
const sf::Input& input = window.GetInput();
InputHandler* inputHandler = new InputHandler(input);
Singleton<InputHandler>::setInstance(inputHandler);

GetInput()不是我的方法之一,它必须返回一个const::Input&

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-08 17:00:43

使用以下方法调用getInstance中的默认构造函数:

代码语言:javascript
运行
复制
instance = new T;

如果有人在getInstance之前调用setInstance,您希望发生什么?

如果在getInstance之前调用setInstance是一个错误,那么在设置实例之前,getInstance应该断言或抛出或返回NULL。只要摆脱new T,您的代码就会编译。

如果在getInstance之前调用setInstance不是一个错误,那么您就没有真正的单例。早期调用者将收到默认构造的对象,随后调用者将在稍后获得该对象集。这是两个实例,因此不是单个实例。

票数 2
EN

Stack Overflow用户

发布于 2011-11-08 08:48:03

如果您有一个引用成员,那么您就不能(明智地)使您的类默认为可构造的或可分配的,因为必须初始化引用,并且不能重新分配。

如果您需要类中的这些属性,那么您可能希望成员是一个指针,默认情况下初始化为null,并在需要时稍后分配。

票数 2
EN

Stack Overflow用户

发布于 2011-11-08 16:52:36

您也许可以让Singleton构造函数设置实例指针,即

代码语言:javascript
运行
复制
Singleton::Singleton()
{
    assert(instance == nullptr);
    instance = static_cast<T*>(this);
}

然后,您可以从接口中删除setInstance函数,getInstance可以简单地返回实例。

作为对评论的回应,我假设类的定义如下:

代码语言:javascript
运行
复制
class MyClassThatShouldBeASingleton : public Singleton<MyClassThatShouldBeASingleton>
{
};

当然,这确实意味着您需要显式地设置这样一个单例,而不是像原始代码中那样自动实例化。这不一定是你想让所有单身人士工作的方式,只是解决问题的一种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8047602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档