2

所以这是我的标题:

//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++ 课,放轻松 :)

4

4 回答 4

1

这是因为您dates current_date;作为warhouse. 当warhouse's 的构造函数被调用时,其所有成员变量的默认构造函数都会被调用。您可以使用符号更改任何成员变量使用的构造函数:(创建初始化列表):

warehouse::warehouse(std::string wname, std::string start_date)
    : current_date(start_date)
{
    wname = name;
}

或者通过简单地为dates.

于 2013-01-31T00:11:30.650 回答
0

使用初始化列表语法:

warehouse::warehouse(std::string wname, std::string start_date):
    wname(name), current_date(start_date)
{
}

在 C++ 中,未在构造函数的初始化列表中列出的任何变量都是默认构造的。初始化列表是您控制调用构造函数的方式,因此您可以避免默认构造。

以这种方式(如果可能)初始化所有类变量是一个好习惯。

于 2013-01-31T00:09:36.417 回答
0

您需要调用 current_date member initializers list

 warehouse::warehouse(std::string wname, std::string start_date)
 :current_date (start_date)
 {
     wname = name;
 }

默认情况下,如果类成员不在member initialize list,则调用默认构造函数,因为dates没有默认构造函数,编译器编译失败。

要初始化没有默认构造函数的类成员,唯一的方法是在member initializers list.

于 2013-01-31T00:09:45.907 回答
0

您必须使用初始化列表:

warehouse::warehouse(std::string wname, std::string start_date) : 
   current_date(start_date)
{
 wname = name;
}

非 POD 数据成员在执行构造函数主体之前被初始化。

于 2013-01-31T00:09:51.930 回答