没有适当的默认构造函数可用错误

Posted

技术标签:

【中文标题】没有适当的默认构造函数可用错误【英文标题】: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): 会调用它,但它不存在。 【参考方案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) 
    
    //..
;

【讨论】:

你建议的语法是什么? 你我的朋友,是一个真正的忍者。非常感谢你。我的代码现在完全按照我想要的方式运行。再次,穆乔斯·格拉西亚斯!!!

以上是关于没有适当的默认构造函数可用错误的主要内容,如果未能解决你的问题,请参考以下文章

使用模板类数据成员的c ++“没有适当的默认构造函数可用”错误

C ++模板类“没有适当的默认构造函数可用”

c++没有合适的默认构造函数可用

error C2512: 没有合适的默认构造函数可用

错误 C2512:没有合适的默认构造函数可用(不是类)

错误 C2512:'Building':没有合适的默认构造函数可用