[問題] 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