我很长一段时间以后几乎完全使用Java,所以我回到了使用C ++的时候,所以当我尝试用Java做的事情但我不能用C ++做的事情时,我会遇到障碍。
在这种情况下,在Java中我可以这样做:
public Map<Integer, Warnings> load(
int maxId,
LocalDateTime timestampStart,
LocalDateTime timestampEnd) {
return create
.select(WARNINGS.fields())
.select(WARNINGS_HISTORY.ID) // Add the ID to the SELECT list
.from(WARNINGS_HISTORY)
.innerJoin(WARNINGS).using(WARNINGS.SIDFILENAME)
.where(WARNINGS_HISTORY.IID.greaterThan(maxId))
.and(WARNINGS_HISTORY.DTCREATEDATE.greaterOrEqual(timestampStart))
.and(WARNINGS_HISTORY.DTCREATEDATE.lessOrEqual(timestampEnd))
.orderBy(WARNINGS_HISTORY.IID.asc())
.fetchMap(
// Mapping the Map key is straight forward
r -> r.get(WARNINGS_HISTORY.ID),
// Mapping the Map value needs an extra step to avoid the ambiguity
// between WARNINGS.ID and WARNINGS_HISTORY.ID when you use into(Class),
// i.e. when you use jOOQ's DefaultRecordMapper
r -> r.into(WARNINGS).into(Warnings.class)
);
}
实质上,我在声明 MyClass 对象时实现 myMethod()的逻辑(注意我的语法可能已关闭)。
我试图找出是否有C ++的等价物
我的特定用例是一组服务器/客户端体系结构的测试,其中Test对象扩展基本的Server / Client抽象类并实现控制其行为的虚拟方法。 我需要为每个特定的测试修改这种行为,并且能够“内联”#34;这些实现在声明Test对象时,而不是必须为每个特定测试在Test对象上实现多个变体。
谢谢!
编辑:我已按照以下方式实施 Smeeheey 的答案,并且像魅力一样
class MyClass
{
public void myMethod();
}
// -------
MyClass myObject = new MyClass(){
myMethod()
{
// Do stuff
}
};
}
答案 0 :(得分:10)
你实际上可以非常接近,使用匿名的本地结构/类:
class MyClass
{
public:
virtual void doStuff() = 0;
};
void doStuffWithMyStruct(MyClass& s)
{
s.doStuff();
}
int main()
{
class: public MyClass
{
public:
void doStuff() override
{
std::cout << "Hello" << std::endl;
}
} s;
doStuffWithMyStruct(s);
return 0;
}
请注意,在上面,变量s
具有匿名类型,与Java非常相似。可以通过引用其基本类型来访问其函数。现场演示here。
答案 1 :(得分:1)
不,C ++中没有等价物,C ++中常用的类也不存在。
在Java中,这会创建一个新的类类型,它派生自MyClass
并覆盖myMethod()
。这是有效的,因为MyClass
类型的变量只是引用,因此这些变量可以保存对派生类的引用。
在C ++中,MyClass
类型的变量不是引用。它们必须是MyClass
类型,没有别的。虽然MyClass &
可以保存对从MyClass
派生的类的引用,但在这种情况下使用引用(或指针)是非常单一的C ++。