Follwing問題。我正在做一個更大的C 專案。該專案有一個中心資料類。mal::FrameAudio,這個資料類看起來像這樣:
class FrameAudio {
public:
typedef Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic> pluginType;
...
const pluginType& getPlug() const。
void setPlug(const pluginType& plugin)。
...
現在我想擴展軟體的一些功能,這需要一個不同的pluginType在我的情況下,我需要:
typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen:: Dynamic> pluginType;
如何在不破壞其他代碼功能的情況下實作新的資料型別?
繼承
繼承性?我想過像這樣做 FrameAudioFloat: public FrameAudio. 但是資料存盤在軟體中被初始化得很早,在我的功能之外,而且據我所知,當一個指標被設定到基類時,你只能使用派生類的重寫函式。所以我不能呼叫getPlug(),因為它有另一種回傳型別。
模板?我正在考慮創建一個模板類?但是我看到,代碼經常使用資料存盤的型別定義。你會發現在代碼中經常出現這樣的東西:
const malconst mal::FrameAudio::pluginType& plugins = aFrame.getPlug();
我甚至在其他類的成員定義中發現了那個型別化的定義。那么,對于我來說,用新的型別定義和功能來擴展這個類的最簡單方法是什么?對我來說,現在只要我的功能能用新的型別定義,其余的代碼仍能用舊的型別定義就足夠了。也許可以使用auto作為型別定義?
uj5u.com熱心網友回復:
你不能動態地改變一個物件的型別,C 不允許這樣。前面說了這么多。
現在,使用一個模板可能是正確的方法。關鍵是,你可能無法在保持代碼不變的情況下改變這一點,而這正是你所要求的。相反,你可以寫類似的代碼,但將unsigned char替換為float,因為這并不觸及現有的代碼。為了避免實際的代碼重復,創建一個模板才是正確的做法:
template <typename scalar> class FrameAudioT
{
//type from the outer class used in the plugin type
typedef Eigen::Matrix<scalar, Eigen::Dynamic, Eigen::Dynamic> pluginType;
//...其他代碼......
};
//for compatibility with existing code:.
typedef FrameAudioT<char> FrameAudio;
像這樣從FrameAudio類開始。然后,挑選下一個仍然依賴于傳統的、非置換的FrameAudio型別的類。一旦這個型別不再被使用,你就可以移除這個型別化的定義。
當然,在中間你可以重構代碼。例如,如果你發現你的代碼只使用了不依賴于其第一個引數的插件介面的子集,你也許可以創建一個純虛擬的基類("介面類")并使用它來代替。細節取決于你的應用,所以很難給出明確的建議。
。uj5u.com熱心網友回復:
我選擇了模板。你通過將插件型別默認為現有的型別,將你現有的代碼變成基本情況:
template <class PluginType =
Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen:: Dynamic
>
class FrameAudio {
public:
typedef PluginType pluginType;
...
const pluginType& getPlug() const。
void setPlug(const pluginType& plugin)>。
};
所以當FrameAudio被使用而不指定模板引數時,它的行為和以前一樣,這意味著現有的代碼和型別定義都可以作業。此外,你還為新的插件型別提供了一個特殊化:
template<>
class FrameAudio<
Eigen::Matrix<float, Eigen::Dynamic, Eigen:: Dynamic>
>
{
public:
using PluginType = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic>;
//你甚至可以訪問基礎模板的類。
//如果你想分享實作的話
....
};
另一個巧妙的技巧是交換幕后的型別,例如定義
using FrameAudio = FrameAudioG<
Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen:: Dynamic>
>。
其中FrameAudioG是具有模板化插件型別的通用版本(如上圖所示)。這樣一來,新用戶就可以利用通用介面,這兩個插件都可以訪問,而傳統的代碼則可以繼續像以前一樣作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/320073.html
標籤:
