1

我看一段 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++ 中完成。主要是我不明白构造函数调用createInstance里面的实现A(在我看来还是不完整的),比如匿名函数实现。我看不到如何createInstance在 C++ 中以某种方式实现该方法,以便IFactory<IThing>定义(抽象)类型的对象,因为通过这种方式,(虚拟)方法createInstance仍然是纯的。或者可以用某种 lambda 函数来完成吗?

有人可以告诉我如何用 C++ 编码吗?谢谢(你的)信息!

4

2 回答 2

1

Java 语言规范写道:

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

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

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

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

于 2013-02-17T15:58:44.657 回答
0

在 C++ 中,您也可以拥有匿名类,就像您可以拥有匿名结构一样(类与具有私有的结构相同)。

但是,我认为你最好不要使用它,因为我们不能显式地使匿名类继承自类 B,在 main 函数中它被强制转换为 B* 非常难看,而且 new 运算符不能直接应用于匿名类。因此匿名实例 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;
}
于 2013-02-17T16:45:03.520 回答