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すべてのメンバー変数のデフォルトコンストラクターが呼び出されます。メンバー変数が使用するコンストラクターを:表記法で変更できます(初期化子リストを作成します)。

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 に答える