【问题标题】:C++ Default constructor not availableC++ 默认构造函数不可用
【发布时间】:2013-09-26 18:11:22
【问题描述】:

我目前正在学习 C++ 并阅读“C++ Primer 5th Edition”。我刚开始学习构造函数,但遇到了一些我想不通的问题。

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data
{
    //default constructor
    Sales_data(const std::string &s, unsigned n, double p):
               bookNo(s), units_sold(n), revenue(p*n) { } 
    //new members: operations on Sales_data objects
    std::string isbn() const { return bookNo; }
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
    //data members
    std::string bookNo;
    unsigned units_sold;
    double revenue;
};

我很确定我写的默认构造函数是正确的(考虑到它是书中写的),但显然我在这里遗漏了一些东西。我没有看到任何语法错误或任何东西,并且所有内置成员都正在初始化,所以我不知道出了什么问题。

编辑:

我刚刚发现不是我的头文件给出了错误,它实际上是我的源文件。当我创建一个 Sales_data 对象时:

Sales_data total;

它给了我“没有合适的默认构造函数可用”错误。考虑到作者给出了三种编写默认构造函数的方法,我仍然不确定出了什么问题,它们是:

struct Sales_data {
// constructors added
Sales_data() = default;   //Number 1
Sales_data(const std::string &s): bookNo(s) { }    //Number 2
Sales_data(const std::string &s, unsigned n, double p):    //Number 3
           bookNo(s), units_sold(n), revenue(p*n) { }

如果这些不是默认构造函数,那么它们到底是什么/它们的目的是什么?

【问题讨论】:

  • 我相信你忘了解释什么问题是什么
  • 这不是默认构造函数——默认构造函数要么不带参数,要么具有所有参数的默认值。
  • 那个头文件里有什么?
  • 显示问题所在的行。
  • 显示准确的编译错误

标签: c++ class compiler-errors default-constructor


【解决方案1】:

默认构造函数是可以在不传递任何参数的情况下调用的构造函数。

这意味着它不能带参数,或者它们都必须有一个默认值。

例如在编写时需要默认构造函数

MyClass x;

因为编译器必须能够生成代码来构建这样的对象而无需任何参数。

根据您使用它们的方式,标准容器可能还需要一个默认构造函数:例如,如果您使用std::vector::resize,则可以要求库增加包含您的类实例的向量的大小,因此它必须能够创建不提供任何参数的元素。

【讨论】:

  • @JBL 只有在没有用户定义的ctor时才会生成默认的ctor。这个类有一个用户定义的ctor,所以没有默认的。
  • 他/她说他/她很确定定义了一个默认构造函数这一事实让我觉得对于默认构造函数是什么感到困惑。顺便说一句,我在显示的代码中看不到任何需要默认构造函数的地方,所以很明显这也不是全部代码。
  • @Angew 对,我忘了,我的错。
  • @Angew:或者当明确要求时,请参阅编辑中的Sales_data() = default; 示例。
【解决方案2】:

问题与默认构造函数无关。问题确实出在Sales_data total; 中。 total的书号、售价和销量是多少?在构造total 时必须提供它们。

【讨论】:

  • 我不想粘贴整个程序(太多空间),但书号、销售价格和售出数量是在运行时由用户输入初始化的。所以你是说我只需要在我的源文件中初始化对象的每个成员?这不是违背了声明默认构造函数的目的吗?
  • @Hysler:通常情况下,您会首先获得用户输入,然后才创建Sates_data 对象。如果存在合理的默认值,默认构造函数有时会很有用。例如,std::vector 开始为空。但是你的类似乎没有一个自然的默认值,所以它也不应该有一个默认的构造函数。
  • 啊,好吧,现在说得通了。感谢 MSalters 的帮助!
【解决方案3】:

你的类的构造函数需要三个参数,当你尝试构造一个对象时必须提供这些参数。您当前的变量声明未提供任何参数:

Sales_data total;

因为没有提供参数,编译器会尝试使用不带任何参数的构造函数。这样的构造函数也称为“默认构造函数”。你的类没有没有参数的构造函数,所以这不起作用。

要使用现有的构造函数,你必须在创建对象时提供参数:

Sales_data total("books", 28, 15.99);

或者,您可以向Sales_data 添加一个不带任何参数的构造函数(默认构造函数),并使用一些默认值初始化类。

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 2016-03-25
    • 2020-05-14
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多