c++到Java的转换-析构函数
C++ to Java Conversion - Destructors
我需要把这个程序转换成java。除了析构函数,其他的我都能处理。现在我已经全面了解了GC(垃圾收集器)及其不可靠性。我在想,如果没有办法,为什么要给我一个析构函数来转换呢?
#include<iostream>
using namespace std;
class Timer{
public:
Timer();
~Timer();
};
Timer::Timer(){
cout<<"Install a timer"<<endl;
}
Timer::~Timer(){
cout<<"Demolition of timer"<<endl;
}
class Bomb: public Timer{
public:
Bomb();
~Bomb();
};
Bomb::Bomb(){
cout<<"Install a timer in bomb"<<endl;
}
Bomb::~Bomb(){
cout<<"Bomb explode..."<<endl;
}
int main()
{
Timer* aTimer = new Timer;
Bomb* aBomb = new Bomb;
delete aTimer;
delete aBomb;
system("pause");
return 0;
}
到目前为止,我想到的是使用Eclipse的这些东西…
public class mainting{
public static void main(String test[])
{
timer atimer = new timer();
bomb abomb = new bomb();
}
}
public class bomb extends timer {
public bomb(){
System.out.println("Install a timer in bomb");
}
}
public class timer {
public timer()
{System.out.println("Install a timer");}
}
很直接,我知道。
这是c++
代码的输出Install a timer
Install a timer
Install a timer in bomb
Demolition of timer
Bomb exploded
Demolition of timer
你可能想看看这篇关于StackOverflow的文章-仔细阅读,因为finalize()
与c++析构函数不同!!你不能假设它是否被调用,哪些对象仍然可用,等等。
我不确定Java的finalize
是否被认为是有害的。
对于考试中的短程序,GC不太可能调用它(如果您在Java版本中提供了finalize()
方法)。但是,您可以证明您知道它是如何工作的,以及c++和Java w.r.t对象销毁之间的区别。
在c++程序中,最后三行输出与c++ Timer对象的销毁有关,然后是c++ Bomb对象,但是Demolition of timer
行出现了两次-我认为您的教授可能试图证明在c++中,因为Bomb继承自Timer,所以析构函数是按照派生类到基类的顺序调用的。
顺便说一句,c++析构函数应该是virtual
,但你可能会在将来的某个时候学到这一点。
作为使用finalize()
特性的替代方案,您可以尝试这样做:
public class mainting{
public static void main(String test[])
{
timer atimer = new timer();
bomb abomb = new bomb();
atimer.destroy(); // since no destructor in Java, add a "destroy()" method
abomb.destroy();
}
}
public class bomb extends timer {
public bomb(){
System.out.println("Install a timer in bomb");
}
public void destroy(){
System.out.println("Bomb exploded");
super.destroy(); // destroy parent object
}
}
public class timer {
public timer()
{System.out.println("Install a timer");}
public void destroy() {
System.out.println("Destruction of timer");
}
}
c++需要析构函数来释放对象持有的资源。最常见的需求是处置动态分配的内存。
在Java中,动态分配的内存是由垃圾回收自动处理的。对于这种情况,不需要析构函数。
其他资源可以通过显式方法来处理。您可以在finally
块中调用此方法,或者在Java 7中使用try-with-resources调用此方法。无论如何,考虑实现一个像java.io.Closeable
这样的接口,它指示需要显式的处理,并提供一个方法来完成。
对于这个程序,main方法的近似翻译是:
public static void main(String test[])
{
timer atimer = new timer();
bomb abomb = new bomb();
try {
atimer.close();
abomb.close();
} catch ( java.io.IOException e ) {
System.err.println( "An error occurred." );
}
}
您可以使用try-with-resources或使用PreDestroy
注释
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 错误 c++ 在令牌之前'('预期的构造函数、析构函数或类型转换
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 获取错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- 错误:令牌之前的预期构造函数、析构函数或类型转换'*'
- 字符串常量之前的预期构造函数、析构函数或类型转换
- 需要构造函数/析构函数/类型转换错误
- C++模板错误:'<'令牌之前的预期构造函数、析构函数或类型转换
- 错误:在非常简单的示例中,预期的构造函数、析构函数或类型转换
- 错误:'<'令牌之前的预期构造函数、析构函数、类型转换
- 令牌之前的预期构造函数、析构函数或类型转换'*'
- 如何使用指针C++将类的析构函数转换为另一个类?类似于单向列表容器类和节点类
- 错误:标记之前的预期构造函数、析构函数或类型转换?
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- C++ 错误:令牌之前的预期构造函数、析构函数或类型转换'*'
- C++ 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- 预期的构造函数、析构函数或类型转换
- 不稳定的声明行为:Rational.h:25:错误:在"&"标记之前预期的构造函数、析构函数或类型转换
- C++错误:"令牌之前的预期构造函数、析构函数或类型转换'<'