我正在翻译一些Java代码到C++。
在Java中,我们可以使用匿名类从现有的构造函数中创建对象,并覆盖一些方法。例如,
class X {
public X(int value) {...}
public void work() {....}
}
void main(String[] args) {
X entity = new X(5) {
public void work() { /* Something else */ }
};
}
在C++中,我知道可以按照以下方式创建匿名类:
class X {
public:
virtual void work() {...}
}
class : public X {
public:
void work() {....}
} obj;
但是C++不允许在匿名类中使用构造函数,并且不允许从对象继承(例如,像Java允许的new X(5) { public void work() {} }
)。
我该如何在C++中编写类似的代码?
更新 03/07/2020 05:27 CDT
关于我正在解决的问题的更多上下文。我正在实现内存中SQL数据库的聚合函数,并使用以下类表示聚合字段:
class AggField {
public:
AggField(int colIndex);
virtual void reduce(DataRow&) = 0;
virtual double output() = 0;
}
对于每种聚合类型,例如平均值、最小/最大值和总和,我都有一个子类。例如:
class Avg : public AggField {
private:
int counter_;
double value_;
public:
Avg(int colIndex) : AggField(colIndex), counter_(0), value_(0) {};
void reduce(DataRow&) override {
value_ += row[colIndex].doubleval();
counter_ += 1;
}
double output() override {
return value_ / counter_;
}
}
class Sum : public AggField {
.....
}
当处理表格时,我会编写以下代码。
Table table = ...
auto agg_opr = Agg({
new Sum(0),
new Avg(1)
});
agg_opr.agg(table);
这段代码会对第0列求和,对第1列求平均。
有时候(很少)我需要处理多个输入列。例如,对col1 * (1 + col2)进行求和。我不想创建一个新的AggField子类,而是希望编写类似于以下内容的代码:
Table table = ...
auto agg_opr = Agg({
new Sum(0) {
void reduce(DataRow& row) {
value_ += row[0].doubleval() * (1 + row[1].doubleval());
}
},
new Avg(1),
new Max(1)
});
agg_opr.agg(table);
X
或需要添加到该类型,则这不是正确的方法)class X { std::function<void()> work = [] () { /***/ }; }; int main() { X foo { [] () { /***/ } }; }
. - George