2014-09-23 73 views
0

我有兩個數據庫的不同類型的對象與一些常見的功能,所以我想創建一個父類與常用函數的定義。這個想法是,即使對象的類型不同,這些函數也必須執行相同的操作。甲傻例如:C++在派生類中指定變量類型後驗

class Database 
{ 
public: 
    // retrieve size of the dataset 
    int Size() const {return list_.size();} 
}; 

class DerivedDatabase : public Database 
{ 
private: 
    // list of dataset objects 
    std::vector<Object1> list_; 
}; 

class DerivedDatabase2: public Database 
{ 
private: 
    // list of dataset objects 
    std::vector<Object2> list_; 
}; 

一種解決方案是定義用作virtual Size() const =0然後有派生類覆蓋它。然而,當我必須創建新類型的數據庫時,這個想法已經實現了。有沒有辦法在派生類中指定後驗變量類型?這兩個派生數據庫本質上是不同的,除了一些常用的功能外,它們的行爲完全不同。因此,他們必須是獨立的對象

+1

一個共同的基類型[CRTP(http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)可以幫助。 – Jarod42 2014-09-23 11:21:43

回答

1

當然,這是什麼template s爲爲:

class Database { 
    virtual int size() = 0; 
public: 
    // retrieve size of the dataset 
    int Size() const {return size();} 
} 

template<typename T> 
class DerivedDatabase: public Database { 
    std::vector<T> list_; 
    int size() const {return list_.size();} 
} 
+0

因此,'Size'不能在'Database'中給出實現。 – Jarod42 2014-09-23 11:25:31

+0

@ Jarod42 right,編輯相應的答案 - 謝謝 – 2014-09-23 11:28:18

+0

@Niall謝謝 - 編輯 – 2014-09-23 11:29:34

2

您可以使用CRTP因式分解代碼,喜歡的東西:

template <typename T> class Database 
{ 
// T should have a container named list_ 
public: 
    // retrieve size of the dataset 
    int Size() const { return AsDerived().list_.size(); } 
private: 
    const T& AsDerived() const { return static_cast<const T&>(*this); } 
    T& AsDerived() { return static_cast<T&>(*this); } 
}; 

然後

class DerivedDatabase : public Database<DerivedDatabase> 
{ 
    friend class Database<DerivedDatabase>; 
private: 
    std::vector<Object1> list_; 
}; 

class DerivedDatabase2 : public Database<DerivedDatabase2> 
{ 
    friend class Database<DerivedDatabase2>; 
private: 
    std::vector<Object2> list_; 
}; 

請注意,DerivedDatabaseDerivedDatabase2不共享這裏

Live example