讓說我有下面的代碼:C++ - 抽象類和替代虛擬構造
class Block{
private:
data Data;
public:
data getData();
Block(arg3 Arg3, arg4 Arg4);
};
其實,有幾種方法可以建立一個塊,但總是以相同的成員數據和方法的getData() ,唯一的區別是如何構建塊。換句話說,唯一的區別是構造函數...
而不是爲每個構建過程編寫一個不同的類,我可以分解我的代碼的一部分,定義和聲明抽象類中的getData,如果有這樣的事情作爲C++中的一個虛擬構造函數,我可以針對與不同構建過程相對應的每個派生類編寫不同的代碼。
我對這種事情沒有太多經驗,所以我想知道是否有虛擬構造函數的替代方案?或者可能是一種不同的方式來做這種分解?
PS:我知道https://isocpp.org/wiki/faq/virtual-functions#virtual-ctors,但它看起來相當複雜,我想做什麼,這似乎很常見......我只是想分解幾個類之間的共享代碼,除了構造函數之外,它們對應於一切。我想強制新的類對應於其他構建過程來實現一個新的構造函數。
更多關於我的特殊情況細節:
我有一個算法,其中我用塊,它不依賴於他們的建設過程中,所以我一直在使用一個模板參數漠然表示塊實現的算法其建設過程。但是我使用了一些方法及其構造函數,所以我需要表示塊的類都具有我需要的相同類型的方法,以及使用它們作爲我的算法實現的模板參數的相同構造函數。這就是爲什麼我想到抽象類,強制一個新實現的代表塊的類在我實現的算法中擁有我需要的方法和構造方法。可能這是一個糟糕的設計模式,這就是爲什麼我堅持......
編輯
謝謝你的答案爲止。我試圖成爲一個通用的,但我覺得它實際上太模糊了,即使我最後提供的細節。所以這是我想的事:我有一個矩陣類如下
// Matrix.hpp
template<typename GenericBlock> class Matrix{
std::vector<GenericBlock> blocks;
Matrix(arg1 Arg1, arg2 Arg2);
};
template<typename GenericBlock>
Matrix<GenericBlock>::Matrix(arg1 Arg1, arg2 Arg2){
// Do stuff
GenericBlock B(arg3 Arg3, arg4 Arg4);
B.getData();
}
塊實際上是壓縮,且存在多種方式對其進行壓縮,並沒有在課堂Matrix
任何改變。爲避免爲每個壓縮工藝編寫一個矩陣類,我使用了一個模板參數。所以我只需要爲每個壓縮工藝編寫一個類,但它們必須具有相同的方法和構造函數參數才能與Matrix
兼容。
這就是爲什麼我想到做一個抽象類,爲每個壓縮工藝編寫一個類。在抽象類中,我會寫出Matrix
中所需的所有內容,以便每個派生類都可以與Matrix
兼容。我的例子中現在的問題是:我可以在抽象類中定義getData
,因爲它總是相同的(例如,Data
可以是行數)。派生類唯一需要定義的就是構造函數。
一個解決方案將是沒有抽象類和使用受保護的構造函數可能。但它不強制新派生類重新實現構造函數。這就是我被卡住的原因。但是我認爲這個問題已經足夠通用以引起其他人的興趣。那麼在這種情況下,有沒有其他的虛擬構造函數? (可能是工廠模式,但對於這樣的常見問題似乎相當複雜)如果不是,是否有更好的方法來實現一個矩陣類,其塊可以以不同的方式構建,即其構造函數可以彼此不同,而有相同的數據和一些共同的方法? PS:我對產生低秩矩陣的壓縮技術感興趣,這就是爲什麼數據總是相同的原因,而不是構建過程。
爲什麼不只是有多個構造函數?在我看來,你是過於複雜的事情。 –
如果您想在運行時配置模塊構建策略 - 爲什麼不使用抽象工廠? –
@JesperJuhl你是什麼意思? –