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'을 정의했다는 것을 의미합니다 ... –

+0

Testable –

답변

5

짧은 대답은 할 수 없습니다. C++에서는 배열이 다형성이 아닙니다. 좋은 이유가 있습니다. What is object slicing?. 예를 들어. arr[i], 컴파일러는 각 요소가 얼마나 큰지 알 필요가 있습니다 (주소 오프셋을 계산하기 위해); 이 계산은 파생 된 유형에 대해 일반적으로 잘못 될 것입니다.

함수 템플릿이나 스마트 (스마트) 포인터의 배열/컨테이너를 사용하는 것이 좋습니다.

1

개체 배열을 가질 수없고 다른 개체 배열로 캐스팅 할 수 없습니다. Vecteur sizeof가 16이고 testable 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

+0

@ weberc2 그것은 나를 위해 작동합니다 : http://codepad.org/pNWtj8yV 오류가 다른 곳에 있어야합니다. 다른 사람들이 지적했듯이 자신의 타입을 std :: 안에 선언하지 마십시오. –

0

이 시도 :

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

코드는 결국 배열의 크기를 모르고 불평합니다. 다형성 (polymorphism)은 포인터를 통해 작동하지만 배열이 아닌 다른 것들은 주목해야한다.

또 다른 가능성으로

, 당신은 정적 배열 모두 종류와 수를 컴파일 타임 다형성을 사용할 수 있습니다

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

또한, 표준 라이브러리 컨테이너는 좋은 솔루션입니다.

+1

이것은 완전히 잘못되었습니다. sizeof (Testable)로 Vecteur의 배열을 보려고하면 첫 번째 포인터 뒤에 잘못된 포인터가 생깁니다. http://codepad.org/ysaJnd5T –

+0

오른쪽. 이것은 한 번에 8 가지 일을 시도 할 때 일어나는 일입니다 .-) 코드 패드에 대한 링크를 가져 주셔서 감사합니다 (저는 Ideone을 사용했고이 게시물에 있어야합니다). +1. 나는 작동하는 것으로 편집 할 것입니다 - 템플릿을 타입하십시오. – emsr

관련 문제