1

複数のクラスを持つライブラリ セクションのデータを処理するプロジェクトに取り組んでいます。ここで気になるクラスのインターフェースはこれ。

class Author
{
  private:
    //data members
  public:
    Author (string _name) ;
    Author (string _name, int _books) ;
} ;

データは少なくとも著者の名前で存在し、いいえ。の本が届くかもしれません。当然、ここにデフォルトのコンストラクターを含めることはできません。しかし、このような静的配列を作成する場合。

Author auth_arr[100] ;

デフォルトのコンストラクターがないため、コンパイラーでエラーが発生します。しかし、このステートメントも無効です。

Author auth_arr[100] ("Jacob") ; 

別のメソッドを作成する代わりに、この配列を作成し、選択したコンストラクターを呼び出す方法はありますか?

4

2 に答える 2

2

これは非常に限られた範囲で行うことができます。トリックは、コンマで区切られた中括弧内でこれらのコンストラクターを明示的に呼び出し、この方法で静的配列をインスタンス化することです。

Author auth_arr [3] = {Author(“Kevin”, 7) ,Author(“Martha”) ,Author(“Shuan”, 15) } ;

しかし、この方法は文字通り悪夢です。これは、サイズが 5 または 10 の配列では実行できますが、サイズが 50 またはそれ以上の配列では実行できません。したがって、より良いオプションは、別のメソッドを作成し、詳細を引数として渡して呼び出すことです。あなたが尋ねたように、これは静的配列専用であることを忘れないでください。静的配列よりも頻繁に使用される動的配列の場合、この方法も適用できません。

C++ では、選択したコンストラクターを別のメソッドで呼び出すことはできません。したがって、デフォルトのコンストラクターは、インスタンス化時に呼び出されるようにクラスで定義する必要があります。その後、データを使用して適切なメソッドを呼び出すことができます。

別のより良い方法は、 std :: vector を使用することです。その詳細は、別の同様の質問 here にあります。 C++ のオブジェクトのコンストラクターと配列

于 2012-09-06T18:04:53.337 に答える
2

ここでデフォルトのc-torが意味をなさないと本当に確信していますか?

私はこの解決策を提案します:

class Author
{
  private:
    //data members
  public:
    static string default_name;
    Author (string _name = default_name);
    Author (string _name, int _books);
} ; 
string Autor::default_name = "NOBODY";

本当に 100 のジェイコブスが必要な場合は、次のようにします。

Author::default_name = "Jacob";
Author auth_arr[100]; 
Author::default_name = "NONE";

[UPDATE1]

ただし、これはローカル配列に対してのみ機能します。ちょっとしたトリックで、静的/グローバル配列に使用できます。私はそれを提示するつもりはありません-あなたのコメントから私が理解しているデフォルトのコンストラクターなしでクラスの静的配列を作成する別の解決策があるためです;)マクロの助けをほとんど借りずに、何千ものオブジェクトを生成することさえできます:

#define MAKE_10(X) X,X,X,X,X,X,X,X,X,X

Author auth_arr[101] = {
   MAKE_10(MAKE_10(Author("Jacob", 0))),
   Author("Jacob", 0)
};
于 2012-09-06T19:04:31.407 に答える