2017-11-14 1 views
0

다음 작업에 약간의 문제가 있습니다.다른 오브젝트로 채워진 벡터

처음에는 하나의 유형의 개체 (자전거)가있는 벡터가있었습니다.

나는이 같은 브랜드와 그 자전거의 모델을 인쇄하려면이 클래스로 넣어 객체를 사용하고 기능을 사용 할 수 :

for (Bike* b1 : vecBikes) { 
     b1->printBrandModel(); 
    } 

내 클래스의 이름은 자전거입니다.

이 클래스에서 나는 Mountain Bikes와 E_Bikes를위한 MTB 인 두 개의 새로운 클래스를 도출했습니다. 내가 파일을 다시 읽고이를 저장하거나 MTB 또는 E_Bike이처럼 내 벡터에 객체로 :

while (inputFile >> brand >> model >> modelyear >> price >> type) { 

    if (type == "MTB") { 
     vecBikes.push_back(new MTB(brand, model, modelyear, price)); 
    } 
    else { 
     inputFile >> energy; 
     vecBikes.push_back(new E_Bike(brand, model, modelyear, price, energy)); 
    } 
    getline(inputFile, buffer); 
} 

가 지금은 꽤 동일해야합니다. 하지만 이번에는이 벡터에서 eihter MTB 또는 E_Bikes를 인쇄하고 싶습니다.

어쩌면 dynamic_cast가 가야할 길입니다.하지만이 주제에 대한 완전한 초보자이며 모든 예제 도서 및 웹 사이트는 어떻게 든 저를 도울 수 없습니다. 나는 당신이 나를 도울 수 있기를 바랍니다이 ;-)

+0

먼저 코드의 형식을 올바르게 지정하십시오. –

+2

'printBrandModel'이'Bike'에서'virtual'으로 선언되고 파생 클래스에서'override'로 선언되는 한 똑같은'for' 루프를 수행 할 수 있습니다 – CoryKramer

+0

더 많은 코드를 보여 주면, 클래스 경로 선언을 보지 않고 올바른 경로에 있는지 확인하십시오. 읽기 : [ask] and this : [mcve] –

답변

2

당신은 다음과 같이 입력 개체를 결정하는 dynamic_cast는 사용할 수 있습니다 :

for (Bike* b1 : vecBikes) { 
    if(dynamic_cast<MTB*>(b1) != nullptr) { 
      b1->print_MBT(); 
    } else if (dynamic_cast<E_Bikes*>(b1) != nullptr) { 
      b1->print_E_Bikes(); 
    } else cout << "error" << endl; 
} 

을 또한, 당신이 당신의 기본 클래스에 순수 가상 메서드 printBrandModel를 정의하는 경우 파생 된 클래스에서 원하는대로 구현할 수 있습니다. 따라서 인스턴스가 어떤 클래스에 속하는지 결정하지 않고 첫 번째 코드를 사용할 수 있습니다.

for (Bike* b1 : vecBikes) { 
    b1->printBrandModel(); 
} 
+1

dynamic_cast 메서드는 추악합니다. 답변의 econd 부분에서 제안한대로 상속을 사용해야합니다. 그것은 고전적인 텍스트 북의 예입니다. –

+0

@MichaelWalz 그는 그것을 알고 있고 그것을 사용하는 방법을 지금은 모르겠다. (dynamic_cast) –

+0

'print_printBrandModel' 함수 이름에 약간의 오타가 있다고 생각합니다. –