理解具有嵌套函数的Java实现(以及用C++进行编码)的困难
Difficulties in understanding a Java implementation with nested functions (and coding it in C++)
我看了一段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;
}
- 如何确定我已使用非编码文件到达 EOF?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 绝对编码器十六进制输入
- 防止C++中的硬编码数字
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用文件内容作为硬编码字符串
- 运行长度编码程序 c++ 的问题
- 以C++为单位进行运行长度编码
- *新的编码器*格式和运算符
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++和带有国家符号的文件路径(也许用 UTF8 编码)
- 仅在 zlib c++ 库中强制动态编码