2013-04-17 34 views
-1

我需要将此程序转换为java。除了析构函数外,我可以处理其他所有的东西。现在我已经阅读了关于GC(垃圾回收器)的所有内容,并且它不可靠。我在想,为什么把一个析构函数转换成无论如何,如果没有任何方式或东西。C++到Java转换 - 破坏者

#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 
+0

Java不工作的方式。相反,使用试用资源。 – SLaks

+0

你想要我们转换此代码?你为什么不尝试发布你所带的东西! – Infested

+0

有时在语言翻译中没有直接翻译。 – andre

回答

0

C++需要析构函数来释放对象持有的资源。最常见的需求是处理动态分配的内存。

在Java中,动态分配的内存由垃圾回收自动处理。为此,析构函数不是必需的。

其他资源可以通过明确的方法处置。您可以在finally区块或Java 7中使用try-with-resources调用此方法。无论如何,考虑实施一个像java.io.Closeable这样的界面,它表明需要明确的处理,并提供了一个方法。

对于这个程序,主要方法的紧密的翻译是:

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."); 
    } 
} 
+0

非常感谢,代码似乎是合法的。我还有一个虽然问题...在C++代码使输出... 安装计时器 安装一个定时器 炸弹安装一个定时器 拆迁定时器 炸弹爆炸计时器 拆迁 – user2292121

+0

你得到Timer的构造函数和析构函数输出两次,因为你已经声明了Bomb is-a Timer。因此,构造/破坏炸弹需要构造/破坏定时器。顺便说一句,欢迎来到Stack Overflow。如果您认为这是最佳答案,请点击左侧的复选标记。您可以通过单击左侧的向上箭头来调出您认为有用的多个答案。 –

+0

非常感谢,我认为你的回答是最好的,每个人都会给我一些关于此事的见解。不幸的是它说我没有足够的声誉。不要担心,我绝对不会在这里伪造我的第一个问题,因为编程世界只是为我开放。 – user2292121

0

您可以使用try-与资源或使用PreDestroy注解。

1

你可能想看看在这个职位上StackOverflow - 请仔细阅读虽然,因为finalize()是不一样的C++析构函数!你不能假设它是否被调用,什么对象仍然可用,等等。

我不确定Java的finalize被认为是有害的。

对于考试中的简短程序,不太可能(如果您在Java版本中提供了finalize()方法),GC会称之为它。但是,您可以证明您知道它是如何工作的,以及C++和Java w.r.t对象销毁之间的区别。

编辑:

在C++程序,输出的最后三行用C++ Timer对象的破坏有关,然后是C++炸弹对象,但行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"); 
    } 
} 
+0

谢谢,输出结果是什么......我发布了C++代码的输出,因为它是析构函数 – user2292121

+0

是的,它实际上是本期中考后的下一章hahaha – user2292121

+0

我修复了更多细节和答案备选建议。希望这可以帮助! – Tom