c++ - 是否可以在 C++ 中使用非默认构造函数创建模板实例?
问题描述
从基于模板的类继承时是否可以指定要使用的构造函数?这似乎是一件基本的事情,但我似乎无法弄清楚如何在 C++ 中实现这一点......
在以下代码中,我想在创建 PlayerActor(继承自 BaseActor 模板类)时为 PlayerStats 对象使用非默认构造函数。
class BaseStats {
public:
BaseStats ()
{
}
private:
};
class MonsterStats : public BaseStats {
public:
MonsterStats()
{
}
private:
};
class PlayerStats : public BaseStats {
public:
PlayerStats(
const bool is_new) :
m_is_new(is_new)
{
}
private:
const bool m_is_new;
PlayerStats(); //Don't want this being used...
};
template <class ActorStatsClass>
class BaseActor
{
public:
BaseActor()
{
}
private:
ActorStatsClass m_stats;
};
class MonsterActor: public BaseActor<MonsterStats> {
public:
MonsterActor()
{
}
private:
};
// This is where I'm not sure how to tell the template to use a non-default constructor...
// I get an error saying "PlayerStats::PlayerStats": cannot access private member declared in "PlayerStats". (Which is intended, but I don't want it to try and use the default constructor...)
class PlayerActor : public BaseActor<PlayerStats> {
public:
PlayerActor(const bool is_new)
{
}
private:
PlayerActor(); // Don't use this...
};
解决方案
template <class ActorStatsClass>
class BaseActor
{
public:
BaseActor()
{
}
private:
ActorStatsClass m_stats;
};
如果这个BaseActor
类将有任意成员,它需要构造这些任意成员的方法。所以它需要一个通用的构造函数。
template <class ActorStatsClass>
class BaseActor
{
public:
template<class...Us>
BaseActor(Us&&...vs)
: m_stats(std::forward<Us>(vs)...)
{ }
private:
ActorStatsClass m_stats;
};
这使用转发,无论传递给什么参数BaseActor
,它只是将它们直接传递给构造m_stats
成员。
这允许:
class PlayerActor : public BaseActor<PlayerStats> {
public:
PlayerActor(const bool is_new)
: BaseActor<PlayerStats>(is_new)
{ }
PlayerActor() = delete; // Note: this is better than making it private
};
推荐阅读
- c# - 将抽象类中的私有字段添加到迁移
- python - 使用 contextmanager 捕获指令以供以后执行
- c# - 如何从 JSON 字符串中提取这些值
- excel - 我的“插入复制的单元格”vba 代码不断崩溃?
- java - 如何使用 Hibernate 在表中插入新行?
- sql - Proc SQL 将日期添加到日期
- security - HTTPS 标头或帖子正文更安全吗?
- google-sheets - 根据单元格值在工作表之间移动行
- python - 为什么默认的 pylintrc 有这么多禁用的消息?
- .net-core - 在 .netcore API 项目中实现 Microsoft Graph API