C++ 中的内部代理实现 class
Inner Proxy implementation in C++ class
我正在调查由 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++ class(与 AsyncTask 同名)。
所以它在 java class 中实现了 c++ 代理来维护 jni 端的 c++ 对象。
但我想用 MFC c++ 语言,而不是 java 语言(通常用于测试目的)
所以我从上层java代码实现了c++class。
但我发现 C++ 没有 static class 定义。
以下代码显示错误
class AsyncTask
{
public:
virtual void execute();
public static class CppProxy : public AsyncTask
{
private:
long LocalNativeRef;
CppProxy(long tmpNativeRef)
{
}
void execute()
{
}
};
};
那么我如何实现在 class.
之外子类化的内部静态 class
您不能从不完整的 class 派生,并且 AsyncTask
在其定义完成之前是不完整的。这就是 class CppProxy : public AsyncTask
失败的原因。
不过,解决方法很简单。只需将 CppProxy
class 设为一个完全独立的,并去掉多余的 public
。如果您需要从 AsyncTask
访问 CppProxy
的私有成员(否则,我不确定静态 Java class 的目的是什么) , 然后使用 friend
声明。
这是一个例子:
class AsyncTask
{
public:
virtual void execute();
friend class CppProxy;
};
class CppProxy : public AsyncTask
{
private:
long LocalNativeRef;
CppProxy(long tmpNativeRef)
{
}
void execute()
{
}
};
请注意,如果您使用支持 C++11 的编译器,您可以并且应该像 Java 中那样使用 override
。而且您显然需要 AsyncTask
.
中的虚拟析构函数
好的,您正在尝试将 Java 翻译成 C++。
在 java 中,内部 class 默认有一个隐藏的指针指向封闭 class 的对象。将其设为静态会删除隐藏的指针 - 换句话说,它不再绑定到包含对象,因此静态 => 在 C++ 和 C++ 内部没有直接等效项 classes 在这个意义上是静态的
在 C++ 中,您不能从不完整的 class 派生:内部 class 不能从其封闭的 class 派生 => 您必须将 CppProxy
class 在 AsyncTask
之外声明。如果你不想把它放在全局命名空间中,你可以把它放在另一个命名空间中,比如 AsyncTaskInner
除了 C++ 中非常特殊的情况外,要派生的 class 应该有一个虚拟析构函数,以便在删除指向基的指针时允许正确的析构函数调用 class => 你必须添加一个虚拟析构函数到 class AsyncTask
.
在 C++ 中,您不会将 class 声明为抽象的,但如果它包含纯虚方法,则可以将其设为抽象 => 将 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()
{
}
};
}
我正在调查由 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++ class(与 AsyncTask 同名)。 所以它在 java class 中实现了 c++ 代理来维护 jni 端的 c++ 对象。
但我想用 MFC c++ 语言,而不是 java 语言(通常用于测试目的) 所以我从上层java代码实现了c++class。 但我发现 C++ 没有 static class 定义。 以下代码显示错误
class AsyncTask
{
public:
virtual void execute();
public static class CppProxy : public AsyncTask
{
private:
long LocalNativeRef;
CppProxy(long tmpNativeRef)
{
}
void execute()
{
}
};
};
那么我如何实现在 class.
之外子类化的内部静态 class您不能从不完整的 class 派生,并且 AsyncTask
在其定义完成之前是不完整的。这就是 class CppProxy : public AsyncTask
失败的原因。
不过,解决方法很简单。只需将 CppProxy
class 设为一个完全独立的,并去掉多余的 public
。如果您需要从 AsyncTask
访问 CppProxy
的私有成员(否则,我不确定静态 Java class 的目的是什么) , 然后使用 friend
声明。
这是一个例子:
class AsyncTask
{
public:
virtual void execute();
friend class CppProxy;
};
class CppProxy : public AsyncTask
{
private:
long LocalNativeRef;
CppProxy(long tmpNativeRef)
{
}
void execute()
{
}
};
请注意,如果您使用支持 C++11 的编译器,您可以并且应该像 Java 中那样使用 override
。而且您显然需要 AsyncTask
.
好的,您正在尝试将 Java 翻译成 C++。
在 java 中,内部 class 默认有一个隐藏的指针指向封闭 class 的对象。将其设为静态会删除隐藏的指针 - 换句话说,它不再绑定到包含对象,因此静态 => 在 C++ 和 C++ 内部没有直接等效项 classes 在这个意义上是静态的
在 C++ 中,您不能从不完整的 class 派生:内部 class 不能从其封闭的 class 派生 => 您必须将 CppProxy
class 在 AsyncTask
之外声明。如果你不想把它放在全局命名空间中,你可以把它放在另一个命名空间中,比如 AsyncTaskInner
除了 C++ 中非常特殊的情况外,要派生的 class 应该有一个虚拟析构函数,以便在删除指向基的指针时允许正确的析构函数调用 class => 你必须添加一个虚拟析构函数到 class AsyncTask
.
在 C++ 中,您不会将 class 声明为抽象的,但如果它包含纯虚方法,则可以将其设为抽象 => 将 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()
{
}
};
}