2015-11-09 6 views
1

Когда я запускаю этот код, он выходит из строя с любыми ошибками. Я пробовал все, что знал и выполнял поиски, но я могу понять это. Он строит и работает отлично и проходит весь путь до cout в FleetCapacity, и что-то в этой строке приводит к сбою кода. Когда я прокомментировал эту строку, код работал нормально, поэтому я не уверен, почему эта строка кода вызывает сбой и сжигание моей программы.Передача указателя на массив объектов в функцию

#include <iostream> 
#include <string> 
using namespace std; 

class Ship{ 
private: 
    string shipName; 
    string shipYear; 
public: 
    Ship(string sN,string sY){shipName=sN; shipYear=sY;} 
    virtual void printInfo(); 
    void setShipName(string); 
    virtual string getShipName(); 
    void setShipYear(string); 
    string getShipYear(); 
}; 

class CruiseShip:public Ship{ 
private: 
    int maxPass; 
    int maxCrew; 
public: 
    CruiseShip(string sN,string sY, int mP,int mC):Ship(sN,sY){setShipName(sN);maxPass=mP; maxCrew=mC; } 
    void printInfo(); 
    void setMaxPass(int); 
    int getMaxPass(); 
    void setMaxCrew(int); 
    int getMaxCrew(); 
}; 

class CargoShip:public Ship{ 
private: 
    int cargoCap; 
public: 
    CargoShip(string sN,string sY,int cC):Ship(sN,sY){setShipName(sN);cargoCap=cC;} 
    void printInfo(); 
    void setCargoCap(int); 
    int getCargoCap(); 

}; 


void Ship::setShipName(string sN){shipName=sN;} 
string Ship::getShipName(){return shipName;} 
void Ship::setShipYear(string sN){shipYear=sN;} 
string Ship::getShipYear(){return shipYear;} 
void Ship::printInfo(){ 
cout<<"The ships name is "<<shipName<<endl; 
cout<<"The ships year is "<<shipYear<<endl; 
} 

void CruiseShip::printInfo(){ 
cout<<"The ships name is "<<getShipName()<<endl; 
cout<<"The ships maximum passangers is "<<maxPass<<endl; 
} 
void CruiseShip::setMaxPass(int mP){maxPass=mP;} 
int CruiseShip::getMaxPass(){return maxPass;} 
void CruiseShip::setMaxCrew(int mC){maxCrew=mC;} 
int CruiseShip::getMaxCrew(){return maxCrew;} 

void CargoShip::printInfo(){ 
cout<<"The ships name is "<<getShipName()<<endl; 
cout<<"The ships cargo capacity is "<<cargoCap<<endl; 
} 
int CargoShip::getCargoCap(){return cargoCap;} 
void CargoShip::setCargoCap(int cC){cargoCap=cC;} 




void fleetCapacity(Ship** s ,int e){ 

    cout << "Name of ship: " << s[e]->getShipName() << endl; 


} 

int main() 
{ 
    const int NUMSHIPS = 3; 
    //int aSize = NUMSHIPS; 
    // array of ship pointers initialized with addresses of dynamically allocated class objects. 
    Ship *ships[NUMSHIPS] = { 
             new Ship("The Dinghy Berry", "1982"), 
             new CruiseShip("Disney Adventure Tours"," ",500,100), 
             new CargoShip("The Sea Trucker"," ", 50) 

             }; 

    for (int i = 0; i < NUMSHIPS; i++) 
    { 
     ships[i]->printInfo(); 
    } 

    cout << "The entire fleet capacity is: "; 
    fleetCapacity(ships, NUMSHIPS); 
    cout << " tons." << endl; 
    return 0; 
} 
+1

Что отделяет отладчик? Программы, как правило, не разбиваются бесшумно, если вы специально не сделали что-то. – Sirens

ответ

1

вы звоните fleetCapacity(ships, NUMSHIPS);, который затем доступ к s[e] (ships[NUMSHIPS]) в функции. Допустимые индексы: 0 - NUMSHIPS-1.

+0

Возможно, я был худшим программистом. –

+0

Хорошо, могу ли я использовать динамическое кастинг, чтобы определить, является ли e [0] кораблем, CruiseShip или CargoShip? Или есть лучший способ это выяснить? –

+0

Я не знаю, что именно вы хотите, чтобы функция выполнялась, но вы должны использовать виртуальные функции, чтобы дать каждому судну другое поведение в зависимости от его класса вместо использования динамических бросков. – Kevin