2016-10-04 178 views
1

我有一個包含一些數據結構的基類,和含有完全相同數據,但賦有一些額外的功能,比如(爲明確起見)一些派生類:C++類具有相同的數據結構

struct Derived : public std::vector<double> 
{ 
    // Constructors, define or inherit 
    using std::vector<double>::vector; 

    double norm() const; 
} 

現在在代碼的另一部分中,我想調用基類型爲std::vector<double>的對象obj的函數norm()。通常,這是沒有意義的,但在這裏:

  • Derived可以從它的底座(構造用使用申報進口中的例子)來構建,
  • Derived和ITSS基地有着完全相同的數據成員。

我可以打電話:

Derived(obj).norm() 

,但我想,以避免不必要的副本。

有沒有一種方法可以簡單安全地重新解析具有相同底層數據結構的對象?或者,也許設計模式爲着裝具有(相當大的)功能集的數據結構可以完全避免該問題?

+1

你可以使用'static_cast',但這將是嚴重類型不安全。這味道像一個XY問題。你試圖解決什麼樣的實際問題。不,不是問題中提到的問題,而是你認爲的答案涉及問題中提到的怪異類結構。 –

+0

你不應該從std容器派生,因爲它們缺少某些你可能需要的程序不會崩潰的特性,比如虛擬析構函數。 has_a受保護的向量成員可能會更好。爲了避免這種情況,你必須不要做某些你應該能夠自由地使用你的類設計的東西,或者通過增加運行時開銷到標準庫來癱瘓整個世界的C++代碼庫。 –

回答

0

可以重載功能,這一切:

struct Derived : public std::vector<double> { 
    using std::vector<double>::vector; 
    inline double norm() const { return norm(*this); } 
    static double norm(const std::vector<double> &) const; 
} 

現在,您可以同時使用兩種Derived::norm(obj)derived.norm(),其中:

  • objstd::vector<double>
  • Derived是類
  • derived是類型爲的對象

如果你想治療Derived,彷彿這是它的基地,使用其基地。

+0

這看起來非常像我要找的東西,雖然對於每個「派生」對象大約30個函數,它可能有點打字 - 或者可怕的宏? – Lio

3

的慣用方法是提供的,而不是成員函數自由函數:

double norm(const std::vector<double>& v) 
{ 
    // ... 
} 

這完全避免了這個問題。

(並請,don't inherit std::vector

+0

或類靜態或接口類。也很好,你有沒有繼承std :: vector。 –

+0

我一直在想這個。缺點是(1)需要分組的大量函數(名稱空間?); (2)基礎是一個[非標準的,感謝]容器,對於不同的派生對象可能有不同的對包含的數據和相應的函數集的解釋。 – Lio

+0

對於(2),這是類型系統的用途。 「對所含數據的不同解讀」應該暗示「不同類型」,否則你就會陷入困境。如果有不同的類型,那麼你可以重載'norm'並且你沒有問題。 –

相關問題