2016-11-03 6 views
0

C++のデフォルトのコンストラクタに関する質問があります。続きあるクラスのオブジェクトを別のクラスの中に入れた静的配列/コンストラクタ

は、クラスとコードです:

class Name 
{ 
    public: 
     Name(string name); 
    private: 
     m_name; 
} 

class DataBase 
{ 
public: 
     DataBase(); 
     void addToDB(string name); 
     Name* getPtrToName(string name); 
private: 
     Name m_Name[10]; 
     int NoOfEntries; 
} 

は今、私はクラスのデータベースのオブジェクトを作成し、データベースに新しいエントリを追加しようとしています。

/* 
* Name.cpp 
*/ 
Name::Name(string name) //overloaded constructor 
{ 
    m_name = name; 
} 


/* 
* DataBase.cpp 
*/ 
DataBase::addToDB(string name) // add entries to the database 
{ 
    Name newEntryToDB(name); 
    m_Name[NoOfEntries] = newEntryToDB; 
    NoOfEntries++; 
} 

DataBase::DataBase() // gives an error stating no matching call for function Name::Name() 
{ 
    NoOfEntries = 0; 
} 

エラー「関数名に該当するコール::名()

今、私は単にName.cppのデフォルトコンストラクタを定義してコンパイルを解決できることを理解しますエラー。 コンパイラによって自動的に呼び出されるデフォルトコンストラクタはありませんか? これはエラーのトリガを回避する必要があります。

Name.cppのデフォルトのコンストラクタを定義する以外に、このエラーを解決する方法はありますか?

+0

あなたの配列**は常に**正確に** 10の要素を含んでいます。どのように配列を最初から初期化したいですか?それを動的にサイズ変更する(DataBaseオブジェクトの有効期間の始めに空にする)場合は、代わりに 'std :: vector'を使用してください。 - または - 実際に名前を何らかの "ダミー"または "ヌル"値に初期化するデフォルトのコンストラクタを定義します。どのようにこのダミー値が定義されているかは、配列の 'NoOfEntries'エントリまでしかアクセスしなければ、ほとんど重要ではありません。 – leemes

+0

@leemes - 正確に! 'NoOfEntries'はデータベースの値を制限するために使われます。コードを単純化するためにここに追加することは避けました。 :) – user2559758

答えて

2

コンパイラによって自動的に呼び出されるデフォルトのコンストラクタはありませんか?

いいえ、それはありません。あなた自身のコンストラクタを提供するとすぐに、コンパイラはもはやデフォルトのコンストラクタを提供しません。あなたは1を加える必要がありますいずれか、またはあなただけのデフォルトコンストラクタを宣言するために、ヘッダファイルにクラス宣言では

Name() = default; 

を使用することができます。

また、std::vectorを使用すると、「配列」を持つことができますが、一度に1つのオブジェクトを追加することができます。

関連する問題