[问题] Java程式码 改写成 C++程式码

楼主: kikilalagirl (kikilala)   2020-09-18 07:15:10
程式码执行环境:
Online Java Compiler - Tutorialspoint ( JDK 1.8.0 )
https://www.tutorialspoint.com/compile_java_online.php
Online C++ Compiler - Tutorialspoint ( (GNU GCC v7.1.1 )
https://www.tutorialspoint.com/compile_cpp_online.php
[Java]
程式码网址: https://pastebin.com/xeNTqctv
宣告cars[]:
Car cars[] = new Car[3];
for(int i=0; i<cars.length; i++)
{
cars[i] = new Car();
}
将以上 Java程式码 改写成 C++程式码
[C++]
改写<方法1>
程式码网址: https://pastebin.com/yUD41ECu
宣告cars[]:
Car cars[length];
改写<方法2>
程式码网址: https://pastebin.com/66XH2eYv
宣告cars[]:
Car* cars = new Car[length];
改写<方法3>
程式码网址: https://pastebin.com/d5AKgDLy
宣告cars[]:
Car* cars[length];
for(int i=0; i<length; i++)
{
cars[i] = new Car();
}
改写<方法4>
程式码网址: https://pastebin.com/KgSnmYqH
宣告cars[]:
Car** cars = new Car*[length];
for (int i=0; i<length; i++)
{
cars[i] = new Car();
}
请教大家,
1) 以上4种C++写法的原理,哪个改写方法最像Java的原理?理由为何?
2) 是否还有其他更像此Java的C++改写方法吗?有的话,如何写?(请贴于pastebin)
作者: Lipraxde (Lipraxde)   2020-09-18 07:38:00
什么叫“最像Java的原理?”?要说是内存管理的部分的话只有 2~4 都会有 memory leak,只有 1 勉强能选,但也不是像 java 的那种垃圾回收机制
作者: CoNsTaR ((const *))   2020-09-18 07:58:00
4 吧,但 C++ 没有 GC
作者: nh60211as   2020-09-18 07:59:00
std::vector<Car> cars(3);
作者: Lipraxde (Lipraxde)   2020-09-18 08:36:00
既然这样,用 shared_ptr 吧,看起来就像有 GC 一样XD
作者: CoNsTaR ((const *))   2020-09-18 09:16:00
我觉得原 Po 的像不像意思是用 stack 或 heap
作者: LPH66 (-6.2598534e+18f)   2020-09-18 09:48:00
其实要说的话 Java 的 reference type 就是“指向”物件的东西, 这玩意在 C++ 的对应物就只是普通的物件指标那么 Java 的 array of reference type 即是 C++ 的array of object pointer, 但因为 Java 没有在 stack 上的静态阵列所以就连阵列都要 new 出来, 这自然就对应 C++的动态阵列了; 以这个观点的话最相近的对应自然是 4
楼主: kikilalagirl (kikilala)   2020-09-18 10:03:00
谢谢LPH大大的解说
作者: kaneson (Lance)   2020-09-18 10:14:00
https://pastebin.com/53uNVZiF以 modern c++ 来说不太建议用new了
作者: Killercat (杀人猫™)   2020-09-18 12:29:00
其实虽然c++没有gc,但是可以用shared_ptr / unique_ptr以及weak_ptr三者组合出类似的效果。难点在于你要怎么handle ownership 不然很多情况下照样出包给你看另外的确别再raw new了 很多类gc library都会提供placement new让你活的惬意点 比方说AGM::LibGC
作者: loveme00835 (发箍)   2020-09-18 12:41:00
比较接近 Java array 语意的应该是 std::array, 只是要自动解构物件的话不是用 std::unique_ptr 就是用std::polymorphic_value, 只是两者语法写起来都会比较麻烦, 不介意自己实作 allocator 的话, 把std::unique_ptr 接上你自己的 allocator 也会比较接近 garbage collector 的行为
作者: kingofsdtw (不能閒下來!!)   2020-09-29 08:47:00
直接包java lib 和 exec先看磁盘需求大小,尽可能不要去翻code

Links booklink

Contact Us: admin [ a t ] ucptt.com