0

我想定義一個抽象基類,然後將該類型的數組(作爲一個派生類的實例顯然是完整的)作爲函數參數傳遞,但編譯器正在對我大喊大叫。有任何想法嗎?如何通過抽象類型的數組作爲函數參數?

例如(「可測試」是抽象的,「Vecteur」是混凝土):

void Testeur::commencerTest(Testable testables[], int nTestables, string titre) { 
    cout << "\n" << titre << "\n"; 
    for (int i=0; i < nTestables; i++) { 
     testables[i].afficher(); 
    } 
} 

// in main function: 
Vecteur v1 = Vecteur(1,2,3); 
Vecteur v2 = Vecteur(4,5,6); 
Vecteur vecteurs[] = { v1, v2 }; 
int nVecteurs = 2; 

this->commencerTest(vecteurs, nVecteurs, "Some text"); 

編譯器在上面的代碼中的第一行說invalid abstract type ‘std::Testable’ for ‘testables’

我該如何傳遞一個抽象類型的數組作爲函數參數?

+4

錯誤信息意味着你已經在'std'命名空間內定義了'Testable',這是不允許的... – 2012-04-25 11:49:59

+0

你應該給我們定義Testable – 2012-04-25 11:50:43

回答

5

簡短的回答是:你不能。數組在C++中不是多態的;這是有原因的 - 參見例如What is object slicing?。請記住,要做arr[i],編譯器需要知道每個元素有多大(計算地址偏移量);一般來說,這種計算對於派生類型來說是錯誤的。

您可以考慮使用函數模板或者(智能)指針的數組/容器。

1

您不能擁有一個對象數組,然後將其轉換爲其他對象數組。 想想看,如果Vecteur sizeof爲16且可測試的sizeof爲4,那麼甚至可以工作?

你想要的是一個指向對象的指針數組。

void commencerTest(Testable* testables[], int nTestables) 
{ 
    for (int i=0; i < nTestables; i++) 
     testables[i]->afficher(); 
} 

int main() 
{ 
    Testable* vect[10]; 

    for(int i=0; i<10; i++) 
     vect[i] = new Vecteur(); 

    commencerTest(vect, 10); 
} 
+0

你的代碼會拋出這個錯誤: ' - >'的基本操作數在'testables [i] - > afficher();'行有非指針類型'std :: Testable'。 – weberc2 2012-04-25 16:40:35

+0

@ weberc2它適用於我:http://codepad.org/pNWtj8yV 錯誤必須在其他地方。正如其他人指出的,不要在std ::中聲明自己的類型。 – 2012-04-25 17:00:42

0

試試這個:

template <typename Type> 
    void Testeur::commencerTest(Type *testables, int nTestables, string titre) { 

的代碼最終會抱怨不知道該數組的大小。多態性將通過指針工作,但不像其他人注意到的那樣是一個數組。

作爲另一種可能性,可以使用編譯時多態性兩種類型和數量的靜態數組:

template<typename Type, size_t Num> 
    void Testeur::commencerTest(Type (&testables)[Num], string titre) { 

此外,標準庫容器是一個很好的解決方案。

+1

這是完全錯誤的。嘗試用sizeof(Testable)跨度Vecteur數組會在第一個指針後面出現錯誤的指針。 http://codepad.org/ysaJnd5T – 2012-04-25 12:35:52

+0

對。這就是試圖一次完成8件事情所發生的事情;-)感謝鏈接到鍵盤(我已經使用了Ideone,並且應該與這篇文章一起)。 +1。我將編輯一些有用的東西 - 模板類型。 – emsr 2012-04-25 13:29:52

相關問題