【问题标题】:no appropriate default constructor available error没有适当的默认构造函数可用错误
【发布时间】:2013-05-08 06:39:19
【问题描述】:

这是我的代码:

class package
{
protected:
    string name;
    string city;
    string state;
    int zip;
    double weight;
    double costPerOunce;

public:

    package::package(string Name, string City, string State, int Zip, double Weight, double CostPerOunce):
      name(Name), city(City), state(State),
      zip(Zip), weight(Weight), costPerOunce(CostPerOunce)
      {

      }
      double calculateCost()
    {
        return (weight * costPerOunce);
    }

};
class twoDayPackage: public package
{
protected:
    double flatFee;
public:
    twoDayPackage::twoDayPackage(double FlatFee):
      flatFee(FlatFee)
      {

      }
    double calculateCost()
    {
        return (weight * costPerOunce) + flatFee;

    }
};
int main()
{


    system ("pause");
    return 0;
}

我尝试运行这段代码,我得到的错误如下: error C2512: 'package' : 没有合适的默认构造函数可用

该错误与基类构造函数的继承有关,但我不知道代码未运行的确切原因。请帮帮我。

【问题讨论】:

  • 请学习基本语法...
  • 当你编写自己的构造函数时,默认的会被覆盖。 twoDayPackage::twoDayPackage(double FlatFee): 会调用它,但它不存在。

标签: c++ inheritance


【解决方案1】:
twoDayPackage::twoDayPackage(double FlatFee):
  flatFee(FlatFee)

正在调用基本构造函数package(),因为您没有指定任何其他内容。

在类包中添加一行package::package(){}; :)

【讨论】:

  • +1,但默认构造函数意味着他不会初始化任何其他成员(重量等)。但是,是的 - 这可能超出了这个问题的范围:)
  • Moo-Juice - 是的,一个简短的答案不是一个完整的答案。我发现一次解决一个问题有助于学习 c++ 语法。
  • 嗯,三个string 会是。
  • 这并没有告诉 OP 危险。
  • 我已添加该行并且程序运行。现在我想让类 twoDayPackage 获取类包的值。请帮忙。
【解决方案2】:

你需要一个包的构造函数。 另外,在声明构造函数时不需要package::package(...)(这是在cpp文件中定义它时)。只需package(...)就可以了。

class package
{
protected:
    string name;
    string city;
    string state;
    int zip;
    double weight;
    double costPerOunce;

public:
    package()
    {}
    // \/ You don't need package:: that's only needed when you define the func in cpp
    package(
        string Name, string City, string State, int Zip, 
        double Weight, double CostPerOunce
    )
        : name(Name), city(City), state(State),
        zip(Zip), weight(Weight), costPerOunce(CostPerOunce)
    {

    }
    double calculateCost()
    {
        return (weight * costPerOunce);
    }

};

【讨论】:

    【解决方案3】:

    twoDayPackage 的构造函数将首先创建package,然后再构造flatFee。由于您没有告诉它如何执行此操作,它会寻找构造 package 的默认方式。

    当您构造twoDayPackage 时,您需要为它提供构造底层package 所需的一切。要么,要么让它确定要传递给package 构造函数的值。

    传入所需的参数如下所示:

    class twoDayPackage {
    public:
        twoDayPackage(string Name, string City, string State, int Zip, double Weight, double CostPerOunce, double flatFee) :
        package(Name, City, State, Zip, Weight, CostPerOunce),
        flatFee(flatFee) {
        }
        //..
    };
    

    【讨论】:

    • 你建议的语法是什么?
    • 你我的朋友,是一个真正的忍者。非常感谢你。我的代码现在完全按照我想要的方式运行。再次,穆乔斯·格拉西亚斯!!!
    猜你喜欢
    • 2016-01-22
    • 2016-03-28
    • 2013-08-25
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多