理解具有嵌套函数的Java实现(以及用C++进行编码)的困难

Difficulties in understanding a Java implementation with nested functions (and coding it in C++)

本文关键字:C++ 编码 嵌套 函数 实现 Java      更新时间:2023-10-16

我看了一段Java代码,我想看看它将如何在C++中实现:

public interface IThing {
    public void method1();
    // more (virtual methods)
}
public interface IThingFactory {
    public IThing getThing(ThingType thing);
}
public interface IFactory<T> {
    public T createInstance();
}
public class A {
    A(ThingType thingType, IFactory<IThing> thingFactory, ...) {
        // ...
    }
    static A create(ThingType thingType, final IThingFactory thingFactory) {
        return new A(new IFactory<IThing>() {
        {
            public IThing createInstance()
            {
                return thingFactory.getThing(thingType);
            }
        }, new IFactory< ... >()
        {
            public IAnother createInstance()
            {
                return anotherFactory.getAnother(anotherType);
            }
        });
    }
    // ... 
}

我希望上面的代码(不完整)说明了我试图找到的东西。我的问题是这将如何在C++中完成。主要是我不理解A构造函数调用中createInstance的实现(对我来说似乎还不完整),就像匿名函数的实现一样。我看不出如何在C++中实现createInstance方法,从而定义(抽象)类型IFactory<IThing>的对象,因为这样(虚拟)方法createInstance仍然是纯的。或者可以用某种lambda函数来实现吗?

有人能告诉我如何用C++编码吗?谢谢你提供的信息!

Java语言规范编写:

非限定和限定类实例创建表达式都可以选择以类主体结束。这样的类实例创建表达式声明了一个匿名类(§15.9.5)并创建了它的实例

该匿名类是类实例创建表达式中命名的类的子类(在您的示例中为:IFactory)。

匿名类的一个特殊特性是,它们可以访问环绕作用域的最终变量。这是通过将它们的值提供给匿名子类的构造函数来实现的,然后该构造函数将它们存储在该子类的最终字段中。

因此,对C++的直接转换是实例化一个命名的子类,该子类将这些值作为构造函数参数。根据代码实际执行的操作,可能存在更惯用的翻译。

在C++中,你也可以有匿名类,就像你可以有匿名结构一样(类与带有private的结构相同)。

然而,我认为你最好不要使用这个,因为我们不能明确地让匿名类从B类继承,在主函数中它被强制转换为B*,这非常丑陋,更重要的是,新的运算符不能直接应用于匿名类。因此,匿名实例c是在堆栈上分配的,当程序超出范围时,它将被删除,这将导致问题。

使用命名子类是标准的方法。

#include <iostream>
using namespace std;
// class B is a pure virtual class which is equivalent to interface in java.
class B
{
public:
    virtual int F() = 0;
};
class A
{
public:
    B * bb;
public:
    A(B* b);
};
A::A(B*b)
{
    bb = b;
}
int main()
{
    class{public: virtual int F(){return 10;}} c;
    A a((B*) &c);
    cout<<a.bb->F()<<endl;
}