C ++继承具有多个参数的构造函数[Homework]

时间:2013-12-16 13:23:50

标签: c++ inheritance

我真的希望这是我最后一次提问作业问题。在过去的七个小时里,我一直在这里工作,已经抛出了我的所有代码三次,而且我似乎无法通过继承构造函数来解决我的问题。我看了其他问题,按照我看到的每一个建议,仍然没有骰子。任何和所有的帮助表示赞赏。

标题文件:

#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

4 个答案:

答案 0 :(得分:2)

Package的构造函数的最后一个参数是Info*,而OvernightPackage的初始化列表是*i传递给它的iInfo*的类型为*i,因此Info&的类型为TwoDayPackage,这与Package的构造函数不一致。

对于Package的初始化列表中的调用,您将向{{1}}的构造函数传递5个参数,而它只需要4个。

答案 1 :(得分: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文件,定义的其余部分,而不是标题。

答案 2 :(得分: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);

答案 3 :(得分: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);

另外,请确保您的基本成员初始化程序具有正确数量和类型的参数。