没有调用正确的构造函数

时间:2013-01-31 00:07:44

标签: c++

所以这是我的标题:

//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 个答案:

答案 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数据成员在构造函数体执行之前被初始化。