[問題] Java程式碼 改寫成 C++程式碼

看板C_and_CPP (C/C++)作者 (kikilala)時間4年前 (2020/09/18 07:15), 4年前編輯推噓4(4024)
留言28則, 8人參與, 4年前最新討論串1/1
程式碼執行環境: 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) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.74.41.244 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1600384517.A.731.html

09/18 07:38, 4年前 , 1F
什麼叫「最像Java的原理?」?
09/18 07:38, 1F

09/18 07:38, 4年前 , 2F
要說是記憶體管理的部分的話只有 2~4 都會有 memory le
09/18 07:38, 2F

09/18 07:38, 4年前 , 3F
ak,只有 1 勉強能選,但也不是像 java 的那種垃圾回收
09/18 07:38, 3F

09/18 07:38, 4年前 , 4F
機制
09/18 07:38, 4F

09/18 07:58, 4年前 , 5F
4 吧,但 C++ 沒有 GC
09/18 07:58, 5F
我也覺得是 方法4. 理由: Java 有兩個 new. C++ 方法1, 沒有 new. C++ 方法2, 有1個 new. C++ 方法3, 有1個 new. C++ 方法4, 有2個 new, 不過覺得這種寫法很變態.

09/18 07:59, 4年前 , 6F
std::vector<Car> cars(3);
09/18 07:59, 6F
※ 編輯: kikilalagirl (42.74.41.244 臺灣), 09/18/2020 08:29:00

09/18 08:36, 4年前 , 7F
既然這樣,用 shared_ptr 吧,看起來就像有 GC 一樣XD
09/18 08:36, 7F

09/18 09:16, 4年前 , 8F
我覺得原 Po 的像不像意思是用 stack 或 heap
09/18 09:16, 8F

09/18 09:48, 4年前 , 9F
其實要說的話 Java 的 reference type 就是「指向」物件的
09/18 09:48, 9F

09/18 09:48, 4年前 , 10F
東西, 這玩意在 C++ 的對應物就只是普通的物件指標
09/18 09:48, 10F

09/18 09:49, 4年前 , 11F
那麼 Java 的 array of reference type 即是 C++ 的
09/18 09:49, 11F

09/18 09:49, 4年前 , 12F
array of object pointer, 但因為 Java 沒有在 stack 上的
09/18 09:49, 12F

09/18 09:50, 4年前 , 13F
靜態陣列所以就連陣列都要 new 出來, 這自然就對應 C++
09/18 09:50, 13F

09/18 09:50, 4年前 , 14F
的動態陣列了; 以這個觀點的話最相近的對應自然是 4
09/18 09:50, 14F

09/18 10:03, 4年前 , 15F
謝謝LPH大大的解說
09/18 10:03, 15F

09/18 10:14, 4年前 , 16F

09/18 10:15, 4年前 , 17F
以 modern c++ 來說不太建議用new了
09/18 10:15, 17F

09/18 12:29, 4年前 , 18F
其實雖然c++沒有gc,但是可以用shared_ptr / unique_pt
09/18 12:29, 18F

09/18 12:29, 4年前 , 19F
r以及weak_ptr三者組合出類似的效果。難點在於你要怎
09/18 12:29, 19F

09/18 12:29, 4年前 , 20F
麼handle ownership 不然很多情況下照樣出包給你看
09/18 12:29, 20F

09/18 12:31, 4年前 , 21F
另外的確別再raw new了 很多類gc library都會提供
09/18 12:31, 21F

09/18 12:31, 4年前 , 22F
placement new讓你活的愜意點 比方說AGM::LibGC
09/18 12:31, 22F

09/18 12:41, 4年前 , 23F
比較接近 Java array 語意的應該是 std::array, 只是
09/18 12:41, 23F

09/18 12:41, 4年前 , 24F
要自動解構物件的話不是用 std::unique_ptr 就是用
09/18 12:41, 24F

09/18 12:42, 4年前 , 25F
std::polymorphic_value, 只是兩者語法寫起來都會比
09/18 12:42, 25F

09/18 12:45, 4年前 , 26F
較麻煩, 不介意自己實作 allocator 的話, 把
09/18 12:45, 26F

09/18 12:45, 4年前 , 27F
std::unique_ptr 接上你自己的 allocator 也會比較接
09/18 12:45, 27F

09/18 12:46, 4年前 , 28F
近 garbage collector 的行為
09/18 12:46, 28F
文章代碼(AID): #1VO-u5Sn (C_and_CPP)
文章代碼(AID): #1VO-u5Sn (C_and_CPP)