2012-04-01 6 views
0
#include<iostream.h> 
    #include<conio.h> 
    #include<string.h> 
    class flight 
    { 
private : 
int flightno; 
char source[30],destination[30]; 
protected : 
double fare; 
public : 
flight() 
{ 
    flightno=0; 
    source[0]='\0'; 
    destination[0]='\0'; 
    fare=0.0 ; 
} 
flight(int f,char s[],char d[],double fr) 
{ 
    flightno=f; 
    strcpy(source,s); 
    strcpy(destination,d); 
    fare=fr; 
} 
flight(flight &f) 
{ 
    flightno=f.flightno; 
    strcpy(source,f.source); 
    strcpy(destination,f.destination); 
    fare=f.fare; 
} 
virtual void accept() 
{ 
    cout<<"\nEnter Fligt no :"; 
    cin>>flightno; 
    cout<<"\nEnter source :"; 
    cin.getline(source,30); 
    cout<<"\nEnter destination :"; 
    cin.getline(destination,30); 
    cout<<"\nEnter fare :"; 
    cin>>fare; 
} 
virtual void display() 
{ 
    cout<<"\nFlight number :"<<flightno; 
    cout<<"\nsource  :"<<source; 
    cout<<"\nDestination :"<<destination; 
    cout<<"\nflight fare :"<<fare; 
    } 
    virtual double computefare()=0; 
}; 
class domestic : public flight 
{ 
private : 
int noc,noa; 
double totalfare,discount; 
public : 
domestic() 
{ 
    noc=0; 
    noa=0; 
    totalfare=0.0; 
    discount=0.0; 
} 
domestic(int f,char s[],char d[],double fr,int nc,int na):flight(f,s,d,fr) 
{ 
    noc=nc; 
    noa=na; 
    totalfare=0.0; 
    discount=0.0; 
} 
domestic(domestic &d):flight(d) 
{ 
    noc=d.noc; 
    noa=d.noa; 
    totalfare=d.totalfare; 
    discount=d.discount; 
} 
void accept() 
{ 
    flight::accept(); 
    cout<<"\nEnter no. of adults :"; 
    cin>>noa; 
    cout<<"\nEnter no. of children :"; 
    cin>>noc; 
} 
void display() 
{ 
    flight::display(); 
    cout<<"\n no. of adults :"<<noa; 
    cout<<"\n no. of children :"<<noc; 
    cout<<"\n total fare :"<<totalfare; 
    cout<<"\n discount :"<<discount; 
    if(discount!=0) 
    cout<<"After disc: "<<(totalfare-discount); 
} 
double computefare() 
{ 
    totalfare=noc*flight::fare*0.5+noa*flight::fare; 
    if(totalfare>40000) 
     discount=0.02*totalfare; 
    return totalfare-discount; 
} 
}; 
class internatinal : public flight 
{ 
private : 
int nop; 
double totalfare,tax; 
public : 
internatinal() 
{ 
    nop=0; 
    totalfare=0.0; 
    tax=0.0; 
} 
internatinal(int f,char s[],char d[],double fr,int np):flight(f,s,d,fr) 
{ 
    nop=np; 
    totalfare=0.0; 
    tax=0.0; 
} 
internatinal(internatinal &i):flight(i) 
{ 
    nop=i.nop; 
    totalfare=i.totalfare; 
    tax=i.tax; 
} 
void accept() 
{ 
    flight::accept(); 
    cout<<"\nEnter no. of passenger :"; 
    cin>>nop; 
} 
void display() 
{ 
    flight::display(); 
    cout<<"\n no. of passenger :"<<nop; 
    cout<<"\n total fare :"<<totalfare; 
    cout<<"\n tax :"<<tax; 
    cout<<"After tax: "<<(totalfare+tax); 
} 
double computefare() 
{ 
    totalfare=nop*flight::fare; 
    tax=0.30*totalfare; 
    return totalfare+tax; 
} 
}; 
int main() 
{ 
int i,n,ch; 
double total=0; 
cout<<"\n Enter no of transaction :" ; 
cin>>n; 
flight *f=new flight[n]; 
for(i=0;i<n;i++) 
{ 
    cout<<"\n Enter 1 : domestic \n 2. internatinal :"; 
    cin>>ch; 
    f[i]=ch==1?new domestic():new internatinal(); 
    f[i]->accept(); 
    total+=f[i]->computefare(); 
} 
cout<<"\n totaL fare :"<<total; 
getch(); 
return 0; 
} 

私はturdo C++コンパイラを使用しています。私のコードは "flight * f = new flight [n];"のmain()にあるエラーをコンパイルできません。関数main()内の `flight :: computefare()= 0 'のため、クラス' flight 'は抽象クラスです。 )。 私が知る限り、抽象クラスのオブジェクトを作成することはできませんが、ポインタを作成することはできます。そして、私はここでポインタを作成していますが、まだこのエラーが出ています。関数main()内の抽象クラスのポインタを作成できません

答えて

3

飛行機のポインタを作成していますが、n飛行オブジェクトも作成しようとしています。作成する配列は飛行機の配列であり、配列のポインタではありません-フライト。

これは動作しません。

std::vector<flight*>などを使用できます(おそらくコンテナ内のスマートポインタを使用することもできます)。 (または飛行機の配列)

あなたの任務のために、1行ですべてを試してはいけません。何も買っていません。それがより明確に書くと、それは動作します:私は飛行* pが[にそれを変更した

if (ch == 1) 
    f[i] = new domestic(); 
else 
    f[i] = new internatinal(); 

(。他のオプションは、キャストを使用することですが、それはその行がさらに小さく読みやすくなります)

+0

OKK 50]その誤差は解けます。しかし、エラーは "f [i] = ch == 1?new domestic():new internatinal();"というエラーになります。エラーは2つのオペランドがmain()の同じ型に評価されなければならない " – rick

+0

@rick:条件演算子は、第2オペランドと第3オペランドの両方が同じ型でなければならないため、エラーです。これを解決するにはキャスト(static_cast )エラー: – Naveen

+0

@rick:私の答えを更新しました、ごめんなさい、その問題を見ていませんでした(もっと最近のコンパイラを入手できれば、MinGWはGCCのかなり良いポートですが、TurboC++は現在のC++標準です。) – Mat