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

相关问题