私はC ++が初めてで、以下の構造体の配列を作成したいと考えています。助けてください!ありがとう
struct contact{
string name;
string address;
string phone;
string email;
contact(string n, string a, string p, string e);
};
問題は、オブジェクトの配列をインスタンス化しようとしているようですがcontact
、デフォルト以外のユーザー定義コンストラクターを追加したため、このクラスにはデフォルトのコンストラクターがありません。これにより、コンパイラによって生成された既定のコンストラクターが削除されます。元に戻すには、次を使用できますdefault
。
struct contact{
string name;
string address;
string phone;
string email;
contact() = default; // HERE
contact(string n, string a, string p, string e);
};
これにより、次のようなことができます。
contact contactsA[42];
std::array<contacts, 42> contactsB;
編集:タイプの単純さを考えると、別の解決策は、ユーザー定義のコンストラクターを削除することです。これにより、型が集約になり、集約の初期化を使用できるようになります。デフォルトの構築を有効にするために特別な操作を行う必要はありません。
struct contact
{
string name;
string address;
string phone;
string email;
};
集計の初期化を使用できるようになりました。
contact c{"John", "Doe", "0123-456-78-90", "j.doe@yoyodyne.com"};
前と同じように配列をインスタンス化します。
contact contactsA[42];
std::array<contacts, 42> contactsB;
C++ では、コンストラクターを使用せずにクラスを作成すると、コンパイラーは単純な既定のコンストラクター、つまり、引数を取らないコンストラクターを作成します。デフォルト以外のコンストラクターを作成したため、コンパイラーはデフォルトのコンストラクターを生成しません。通常、次のように「連絡先」タイプの配列を作成します。
contact my_array[10];
これにより、各メンバーで連絡先の既定のコンストラクターが呼び出されます。デフォルトのコンストラクターがないため、コンパイルに失敗する可能性があります。
デフォルトのコンストラクターを追加することをお勧めします。新しい構造体は次のようになります。
struct contact{
string name;
string address;
string phone;
string email;
contact(); // This is your default constructor
contact(string n, string a, string p, string e);
};
これを行うと、次のように配列を作成できるようになります。
contact my_array[10];
#include <vector>
#include <array>
#include <string>
using std::string;
struct contact{
string name;
string address;
string phone;
string email;
contact(string n, string a, string p, string e);
};
std::vector<contact> contacts1; // for an array without a size known at compile time.
std::array<contact, 1> contacts2 = { // for an array with a known and static size.
contact{ "Bob Smith", "42 Emesgate Lane, Silverdale, Carnforth, Lancashire LA5 0RF, UK", "01254 453873", "bob@example.com"}
};