所以这是我的标题:
//warehouse.h
#ifndef WAREHOUSE_H
#define WAREHOUSE_H
#include<string>
#include<map>
#include "dates.h"
namespace a4
{
class warehouse
{
public:
warehouse(std::string name, std::string start_date);
private:
std::string name;
std::string busiest_day;
int most_transactions;
dates current_date;
std::map<std::string, a4::food> items;
void next_day();
};
}
#endif
我的.cc:
//warehouse.cc
#include "warehouse.h"
#include "dates.h"
namespace a4
{
//constructor
warehouse::warehouse(std::string wname, std::string start_date)
{
wname = name;
current_date = dates(start_date);
}
void warehouse::next_day()
{
current_date.next_day();
}
}
编译错误:
warehouse.cc: In constructor ‘a4::warehouse::warehouse(std::string, std::string)’:
warehouse.cc:6: error: no matching function for call to ‘a4::dates::dates()’
dates.h:10: note: candidates are: a4::dates::dates(std::string)
dates.h:8: note: a4::dates::dates(const a4::dates&)
从错误看,它看起来像是调用零参数构造函数而不是带有字符串的构造函数。我构建的日期类显然没有零参数构造函数。
我一直试图弄清楚这几个小时,任何帮助将不胜感激。在类似的问题中,我被告知要查找成员初始化列表。我已经并且并不真正理解如何正确实现它,因为它似乎无法解决问题。
这个学期只有几个星期,这是我在c ++上的第一堂课,对我很轻松:)
答案 0 :(得分:1)
这是因为您dates current_date;
成为warhouse
的成员。调用warhouse
的构造函数时,将调用其所有成员变量的默认构造函数。您可以使用:
表示法更改任何成员变量使用的构造函数(创建initializer list):
warehouse::warehouse(std::string wname, std::string start_date)
: current_date(start_date)
{
wname = name;
}
或者只是为dates
定义一个空白构造函数。
答案 1 :(得分:0)
使用initializer list语法:
warehouse::warehouse(std::string wname, std::string start_date):
wname(name), current_date(start_date)
{
}
在C ++中,构造函数初始化列表中未列出的任何变量都是默认构造的。初始化列表是您控制调用哪个构造函数的方式,因此您可以避免默认构造。
以这种方式初始化所有类变量是一种很好的做法(如果可能的话)。
答案 2 :(得分:0)
您需要在member initializers list
中调用current_date:
warehouse::warehouse(std::string wname, std::string start_date)
:current_date (start_date)
{
wname = name;
}
默认情况下,如果类成员不在member initialize list
中,则将调用默认构造函数,因为dates
没有默认构造函数,编译器无法编译它。
要初始化没有默认构造函数的类成员,唯一的方法是在member initializers list
初始化它。
答案 3 :(得分:0)
您必须使用初始化列表:
warehouse::warehouse(std::string wname, std::string start_date) :
current_date(start_date)
{
wname = name;
}
非POD数据成员在构造函数体执行之前被初始化。