2014-09-05 31 views
3

我創建了一個標準結構的「智能變體」 - 系統提供了struct canmsg,該類型的數據是從罐設備讀取的,我經常處理這些框架。從「啞」基類構建對象

現在,爲了更容易處理它們,我創建了一個子類:class TCanFrame : public canmsg。它沒有任何額外的屬性,但它有一堆方法 - 從頭開始​​創建框架的友好構造器,命令和數據,讀取器和設置器,讀取和設置不同的屬性「上面的抽象層」(例如,通道子地址編碼數據)。

struct canmsg_t實例構造TCanFrame類型的對象的最佳方法是什麼?我可以只從&sourcethis做一個memcpy嗎?或者我是否需要逐場複製它?或者其他一些技巧,以創建一個整潔的TCanFrame實例「愚蠢」canmsg或者也許我可以讓複製構造函數接受父類?

+0

即使它是正確的,可能可以工作,我不認爲它的複製將是如此安全......字段的副本字段對我來說是正確的方式來做到這一點,順便說一下,我不是因此,從結構/類構建一個類,這是不是你的 – CollioTV 2014-09-05 11:32:31

回答

4

您可以使用編譯器提供的默認拷貝構造函數:

TCanFrame(const canmsg& msg) : canmsg(msg) {} 
6

如果不添加任何數據成員,並且不需要訪問的canmsg任何保護成員,我認爲你不應該」創建一個派生類。相反,您可以添加免費函數以在定義canmsg的名稱空間中執行額外功能,然後將它們與普通的canmsg對象一起使用。你可以閱讀更多關於班級「非會員界面」的內容,以及爲什麼這是一件好事。這些文章由Scott MeyersHerb Sutter

還要注意的是,如果你創建一個派生類和canmsg沒有虛析構函數,你可以很容易地通過調用一個canmsg*它實際上指向一個TCanFrame對象delete碰到不確定的行爲。

+0

這些文章中討論的'打破如果有什麼改變'這裏不是我的關注 - 我操作的操作系統提供的結構,不可能在它們之前改變底層技術消失殆盡。 OTOH,他們忽視可讀性。 'CanFrame :: Length(msg)'遠不如'msg.Length()'可讀。 – 2014-09-05 11:52:35

+0

@SF。關鍵是你不必做'CanFrame :: Length(msg)',你可以做'Length(msg)',相應的'Length'可以通過[ADL]找到(http:// en .wikipedia.org /維基/參數-dependent_name_lookup)。我不覺得這個可讀性更低,而且它有好處:它可以與所有'canmsg'對象一起使用,而不僅僅是您自己的包裝器,並且您可以節省數據重複。作爲一個例子,'static_pointer_cast'等人。也是名字空間'std'中的函數,而不是'std :: shared_ptr'的成員。 – Angew 2014-09-05 11:56:48