gpt4 book ai didi

java - C++ 类中的内部代理实现

转载 作者:行者123 更新时间:2023-11-30 03:43:58 26 4
gpt4 key购买 nike

我正在调查由 dropbox 发布的跨平台库。以下java代码来自它。我想在我的 Visual C++ 中实现同样的东西;先看java代码

public abstract class AsyncTask 
{
public abstract void execute();

public static final class CppProxy extends AsyncTask
{
private final long nativeRef;
private final AtomicBoolean destroyed = new AtomicBoolean(false);

private CppProxy(long nativeRef)
{
if (nativeRef == 0) throw new RuntimeException("nativeRef is zero");
this.nativeRef = nativeRef;
}

private native void nativeDestroy(long nativeRef);
public void destroy()
{
boolean destroyed = this.destroyed.getAndSet(true);
if (!destroyed) nativeDestroy(this.nativeRef);
}
protected void finalize() throws java.lang.Throwable
{
destroy();
super.finalize();
}

@Override
public void execute()
{
assert !this.destroyed.get() : "trying to use a destroyed object";
native_execute(this.nativeRef);
}
private native void native_execute(long _nativeRef);
}
}

此 java 代码调用一些 jni c++ 类(它与 AsyncTask 同名)。所以它在 java 类中实现了 c++ 代理来维护 jni 端的 c++ 对象。

但我想用 MFC c++ 语言来做,而不是 java 语言(通常用于测试目的)所以我从上层Java代码实现了C++类。但我发现 C++ 没有静态类定义。以下代码显示错误

class AsyncTask 
{
public:
virtual void execute();

public static class CppProxy : public AsyncTask
{
private:
long LocalNativeRef;

CppProxy(long tmpNativeRef)
{

}

void execute()
{

}
};
};

那么我如何实现在类外部进行子类化的内部静态类。

最佳答案

好的,您正在尝试将 Java 翻译成 C++。

在 Java 中,内部类默认有一个指向封闭类对象的隐藏指针。将其设为静态会删除隐藏的指针 - 换句话说,它不再绑定(bind)到包含对象,因此静态 => 在 C++ 中没有直接等效项,并且 C++ 内部类在这个意义上是静态的

在 C++ 中,您不能派生自不完整的类:内部类不能派生自其封闭类 => 您必须将 CppProxy 类声明放在 AsyncTask 之外。如果你不想把它放在全局命名空间中,你可以把它放在另一个命名空间中,比如 AsyncTaskInner

除非在 C++ 中非常特殊的情况下,一个旨在派生的类应该有一个虚拟析构函数,以便在您删除指向基类的指针时允许正确的析构函数调用 => 您必须向类 AsyncTask 添加一个虚拟析构函数

在 C++ 中,您不会将一个类声明为抽象类,但如果它包含一个纯虚方法,您可以将其设为抽象 => 将 execute 声明为纯虚

你以这样的方式结束:

class AsyncTask 
{
public:
virtual void execute() = 0;
virtual ~AsyncTask() {}
};


namespace _AsyncTaskInner {
class CppProxy : public AsyncTask
{
private:
long LocalNativeRef;
public:

CppProxy(long tmpNativeRef)
{

}

void execute()
{

}
};
}

关于java - C++ 类中的内部代理实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35795640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com