作为硕士论文,我需要在github上扩展数据库duckdb的功能。
第一步是创建一个固定的内部计划,代表类似于“选择 42”;只是在物理层面上。为此,我厌倦了使用duckdb 内部使用的类手动创建这样的计划。
在编译时,我通常会收到如下错误消息:
/home/ubuntu/git/duckdb/src/include/common/helper.hpp: In instantiation of ‘std::unique_ptr<T> duckdb::make_unique(Args&& ...)
[with T = duckdb::Expression; Args = {duckdb::ExpressionType,
duckdb::ExpressionClass, duckdb::TypeId}]’:
/home/ubuntu/git/duckdb/src/execution/physical_plan_generator.cpp:125:155:
required from here
/home/ubuntu/git/duckdb/src/include/common/helper.hpp:24:23: error:
invalid new-expression of abstract class type ‘duckdb::Expression’
return unique_ptr<T>(new T(std::forward<Args>(args)...));
创作是这样的:
unique_ptr<Expression> ProjectionExpression = make_unique<Expression>(ExpressionType::VALUE_CONSTANT, ExpressionClass::BOUND_CONSTANT, TypeId::INTEGER);
构造函数是
Expression::Expression(ExpressionType type, ExpressionClass expression_class, TypeId return_type)
: BaseExpression(type, expression_class), return_type(return_type) {
}
基表达式为
BaseExpression(ExpressionType type, ExpressionClass expression_class)
: type(type), expression_class(expression_class) {
}
virtual ~BaseExpression() {
}
如您所见,类表达式使用类 baseExpression 的初始化列表。据我所知,两者之间没有直接继承,但显然我需要当前缺少的东西来正确初始化构造函数。
问题是通常在duckdb中,这些东西来自解析器,然后从这些对象构建。我必须尝试猜测数据结构应该是什么样子。
我在弄清楚如何使用 make_unique 直接分配此对象时遇到问题,因为表达式显然需要某种 baseExpression,但 baseexpression 本身具有虚拟组件,因此我也不能直接创建该组件。
基本上我要问的是:当类是抽象的时,你如何创建一个新的 unique_ptr 对象?