我目前正在学习C++和阅读"C++初级第5版“。我刚开始学习构造函数,我遇到了一个我无法解决的问题。
#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) { }如果这些不是默认的构造函数,那么它们/它们的目的究竟是什么?
发布于 2013-09-26 09:37:10
默认构造函数是可以不传递任何参数而调用的构造函数。
这意味着它必须不接受任何参数,或者所有参数都必须有一个默认值。
例如,当您编写
MyClass x;因为编译器必须能够生成代码来构建这样一个没有任何参数的对象。
此外,标准容器可能需要一个默认构造函数,具体取决于您如何使用它们:例如,如果使用std::vector::resize,可以要求库增加包含类实例的向量的大小,因此它必须能够在不提供任何参数的情况下创建元素。
发布于 2013-09-26 10:01:58
这个问题与默认构造函数无关。问题确实存在于Sales_data total;中。total的书号、售价和销售号码是多少?您必须在构建total时提供它们。
发布于 2013-09-26 10:11:22
类的构造函数包含三个参数,在尝试构造对象时必须提供这些参数。当前变量声明不提供任何参数:
Sales_data total;因为没有提供参数,所以编译器尝试使用不接受任何参数的构造函数。这样的构造函数也称为“默认构造函数”。您的类没有没有参数的构造函数,因此这是行不通的。
要使用现有构造函数,必须在创建对象时提供参数:
Sales_data total("books", 28, 15.99);或者,您可以向Sales_data添加一个不接受任何参数(默认构造函数)的构造函数,并使用一些默认值初始化该类。
https://stackoverflow.com/questions/19024442
复制相似问题