2013-12-16 111 views
1

我真的很希望這是我最後一次問作業問題的時間。過去七個小時我一直在這裏工作,三次拋出所有的代碼,並且我似乎無法通過繼承構造函數來克服我的問題。我看了其他的問題,跟着我看到的每一個建議,而且還沒有骰子。任何和所有的幫助表示讚賞。C++繼承具有多個參數的構造函數[作業]

頭文件:

#ifndef PACKAGE_H 
#define PACKAGE_H 

struct info 
{ 
    std::string sName; 
    std::string sAddr; 
    std::string sCity; 
    std::string sState; 
    std::string sZip; 

    std::string rName; 
    std::string rAddr; 
    std::string rCity; 
    std::string rState; 
    std::string rZip; 
}; 

class Package 
{ 
public: 
    Package(int c, double w, double co, info *i); //Constructor. Will implement 
             //all data types 

    ~Package();       // Default Destructor 

    virtual double calculateCost();  // Not pure, can be overloaded 

protected: 

    int counter; 
    double weight; 
    double cost; 

    info sendRecieve;      // Struct for holding tedious info 
}; 

class TwoDayPackage : public Package 
{ 
public: 
    TwoDayPackage(int c, double w, double co, info *i, double a) 
    :Package(c, w, co, *i, a); 

    double calculateCost(); 

private: 
    double flatFee; 
}; 

class OvernightPackage : public Package 
{ 
public: 
    OvernightPackage(int c, double w, double co, info *i, double a) 
    :Package(c, w, co, *i); 

    double calculateCost(); 

private: 
    double addtlCost; 
}; 

的.cpp定義文件:

#include "Package.h" 

using namespace std; 

Package::Package(int c, double w, double co, info *i) 
{ 
    cost = c; 
    weight = w; 
    cost = co; 

    sendRecieve.sName = i->sName; 
    sendRecieve.sAddr = i->sAddr; 
    sendRecieve.sCity = i->sCity; 
    sendRecieve.sState = i->sState; 
    sendRecieve.sZip = i->sZip; 

    sendRecieve.rName = i->rName; 
    sendRecieve.rAddr = i->rAddr; 
    sendRecieve.rCity = i->rCity; 
    sendRecieve.rState = i->rState; 
    sendRecieve.rZip = i->rZip; 
} 

double Package::calculateCost() 
{ 
    return (cost * weight); 
} 

// end base class definitions 

TwoDayPackage::TwoDayPackage(int c, double w, double co, info *i, double a) 
    :Package(c, w, co, *i) 
{ 
    flatFee = a; 
} 

double TwoDayPackage::calculateCost() 
{ 
    return ((cost * weight) + flatFee); 
} 

//end TwoDayPackage definitions 

OvernightPackage::OvernightPackage(int c, double w, double co, info *i, double a)  :Package(c, w, co, *i) 
{ 
    addtlCost = a; 
} 

double OvernightPackage::calculateCost() 
{ 
    double multi = (addtlCost + cost); 

    return (multi * weight); 
} 

這裏是我不斷收到錯誤的圖像。如果有人可以幫助,我會感激。此外,歡迎任何建議。提前感謝大家。

Screenshot of errors

+1

錯誤說明了這一切:'Package'沒有帶5個參數的構造函數。然而你試圖在'TwoDayPackage'構造函數中調用它。 – juanchopanza

回答

0

這是行不通的。你的構造函數只需要4個參數,你用5來調用它。

class TwoDayPackage : public Package 
{ 
public: 
    TwoDayPackage(int c, double w, double co, info *i, double a) 
    :Package(c, w, co, *i, a); //Here 

//[...] 
Package(int c, double w, double co, info *i); 
0

從構造函數聲明中刪除基礎成員初始化。

也就是說,在你的頭,更換

TwoDayPackage(int c, double w, double co, info *i, double a) 
    :Package(c, w, co, *i, a); 

,只需要簡單

TwoDayPackage(int c, double w, double co, info *i, double a); 

此外,請確保您的基座部件initialisers有參數的正確數量和類型。

2

Package構造函數的最後一個參數是Info*同時詮釋他的初始化OvernightPackage列表傳遞*i它。 i的類型是Info*,因此*i的類型爲Info&,這與Package的構造函數不同。

至於在TwoDayPackage的intialization列表中的電話,你是路過5個參數的Package構造,而只需要4

1
Package(int c, double w, double co, info *i); 

TwoDayPackage(int c, double w, double co, info *i, double a) 
:Package(c, w, co, *i, a); 

兩個問題在這裏:首先,TwoDayPackage正在請求Package構造它有五個參數,但定義的只有四個參數。

但一個相當大的問題是初始化器列表 - 在:後位 - 屬於定義,而不是聲明,所以它需要在你的.cpp文件中去,與定義的其餘部分,不在標題中。