[問題] C++ header file 疑問

看板C_and_CPP (C/C++)作者 (尋找獨立遊戲製作團員!)時間9年前 (2016/06/23 15:48), 編輯推噓8(8011)
留言19則, 11人參與, 最新討論串1/2 (看更多)
最近因為要用到一個開源專案, 需要看裡面的C++ code, 本身對C++不熟 但越看覺得越疑惑, 本身是有JAVA經驗, 同樣是OOP, 看來想法很不一樣 C++跟C一樣, 需要header file, 我自己的直覺是這樣 header負責定義框架, 讓其他人只要看到header, 就知道這個class有些甚麼, 包含 include了那些其他文件, 類別方法的signature, 等等 cpp檔案負責實作這些邏輯, 理想情況下, 一個cpp檔只定義一個類別, 並只include自己 的header file 例如 cup.h #include <string> namespace EX { class Cup { public: drink(); fill(); private: bool canDrink; } } cup.cpp #include "cup.h" Cup::drink() { canDrink = false; } Cup::fill() { canDrink = true; } 但實際上, 我看到的source code, header裡面有include一堆文件, cpp檔又include另一 堆, 然後header裡面定義不止一個class, 而且還有實作邏輯在裡面. 閱讀起來真的是一 種折磨. 我想問的是, C++寫成這樣是一種怎樣的pattern? 因為開源專案都有很多人在寫, 如果 分散成這樣, 應該很難互相合作才對, 所以這種pattern是代表某種大家認同的設計模式? C++的header該負責甚麼內容, 是不是有大家比較公認的pattern? -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.246.99 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1466668104.A.37A.html

06/23 15:57, , 1F
header 放的是要匯出給其他 source 用的宣告
06/23 15:57, 1F

06/23 15:57, , 2F
只放必要的東西。dependency 越少越好
06/23 15:57, 2F

06/23 16:03, , 3F
C++沒有Java的package機制, include是複製貼上而已
06/23 16:03, 3F

06/23 16:04, , 4F
然後實作寫在header裡通常是因為template
06/23 16:04, 4F

06/23 16:21, , 5F
開發跟release的也許會不同
06/23 16:21, 5F

06/23 16:46, , 6F
給實際例子,那些專案把實作邏輯寫在.h
06/23 16:46, 6F

06/23 19:39, , 7F
header是服務編譯器的機制 不是服務人的 所以才會那麼怪
06/23 19:39, 7F

06/23 23:02, , 8F
header要弄得很好其實很不容易,亂寫倒是很簡單XD
06/23 23:02, 8F

06/24 00:59, , 9F
話說不是在討論要不要加package 跟module 進c++20裡了
06/24 00:59, 9F

06/24 03:22, , 10F
好像有牽扯到 template 的東西都只能把實作寫在 header
06/24 03:22, 10F

06/24 03:22, , 11F
裡 因為 compiler 要靠 header 生 code
06/24 03:22, 11F

06/24 03:23, , 12F
例如 Boost 整個專案幾乎只有 header
06/24 03:23, 12F

06/24 03:24, , 13F
有時候不是不想把宣告跟定義分開 而是因為現實迫於無奈
06/24 03:24, 13F

06/24 03:25, , 14F
然後 include 的問題...我覺得 header 應該維持最小 incl
06/24 03:25, 14F

06/24 03:25, , 15F
ude 原則 實作才需 include 的東西就放在實作裡
06/24 03:25, 15F

06/24 09:41, , 16F
最小 include 原則也是有得討論, 例如 Google C++ 風格
06/24 09:41, 16F

06/24 23:22, , 17F
只有實作時才需要用到的就在cpp include
06/24 23:22, 17F

06/24 23:22, , 18F
class會用到的才會在h檔include
06/24 23:22, 18F

06/25 02:09, , 19F
等等 不是開源專案就代表都是好的coding style阿~
06/25 02:09, 19F
文章代碼(AID): #1NQvH8Dw (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1NQvH8Dw (C_and_CPP)