[問題] 回傳物件 codeblock編譯問題

看板C_and_CPP (C/C++)作者 (布萊迪諾)時間10年前 (2015/11/26 23:38), 編輯推噓3(307)
留言10則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) win7 codeblock_10.05 問題(Question): 回傳物件,其值不同 餵入的資料(Input): new出兩個新物件回傳 程式碼(Code):(請善用置底文網頁, 記得排版) 我有一個main.cpp和三個分開寫的class, .h和.cpp 共7個檔案簡短大概如下 class A{ public: A(); int getID(); private: int id; //建構子預設23 } ----------------------------------- class B: public A { }//空的內容 ----------------------------------- class Foo{ public: A* createObject(int); } ----------------------------------- int main() { Foo factory; A* aaa1 = new B ; A* aaa2 = factory.createObject(2); //new出一個物件並回傳 cout << aaa1->getID() << endl ; cout << aaa2->getID() << endl ; return 0; } 我在下面switch中new出物件並回傳後 A* Foo::createObject(int a) { switch (a) { case 2: return new B; default: //return new B; break; } } 其最後印出來兩個值的結果是不一樣的,debug好久又去找VS來試 嘗試之後,發現是否全部的條件判斷後都有回傳東西有差 codeblock_10.05 VS2010 結果 不一樣 ex:23 80 一樣 ex:23 23 拿掉return 一樣 一樣 的註解後 另外我把所有內容全寫進一個main.cpp中就沒有出現這問題 請教前輩,為什麼會這樣? 是我寫法不夠嚴謹的關係還是編譯器無法處理這事? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.145.126 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1448552297.A.4C6.html

11/27 00:26, , 1F
會不會是哪裡有用到 incomplete type
11/27 00:26, 1F

11/27 03:00, , 2F
問題就在於「是否全部的條件判斷後都有回傳東西」這回事
11/27 03:00, 2F

11/27 03:00, , 3F
你若沒寫 return 它會隨便回傳給你一個值
11/27 03:00, 3F

11/27 03:01, , 4F
這個值是回傳當下附近剛算過什麼值隨手抓
11/27 03:01, 4F

11/27 03:02, , 5F
是不是抓到你想要的值是無法預期的
11/27 03:02, 5F

11/27 03:03, , 6F
像你這樣回傳指標的狀況更無法預期回傳的是否指向合法物件
11/27 03:03, 6F

11/27 09:00, , 7F
就剛好放到Eax去啦XD
11/27 09:00, 7F

11/27 15:03, , 8F
不過原po的程式使用例中好像沒有用到default那段?
11/27 15:03, 8F

11/27 16:50, , 9F
的確沒用到default,程式碼寫成一定會回傳一個B回去
11/27 16:50, 9F

11/27 16:54, , 10F
但return的B跟我直接在main中new出來的B 不太一樣
11/27 16:54, 10F
文章代碼(AID): #1MLoTfJ6 (C_and_CPP)
文章代碼(AID): #1MLoTfJ6 (C_and_CPP)