在对象数组的每个索引上调用不同的构造函数

时间:2012-09-06 18:03:51

标签: c++ arrays oop object constructor

我正在开发一个处理具有多个类的库部分数据的项目。这里有一个类的兴趣界面就是这个。

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

数据至少包含作者的姓名,而且没有。书籍可能会出现。我自然不能拥有默认构造函数。但是如果像这样创建一个静态数组。

Author auth_arr[100] ;

由于缺少默认构造函数,编译器给出了错误。但这种说法也是无效的。

Author auth_arr[100] ("Jacob") ; 

是否有任何方法可以创建此数组并调用我选择的构造函数,而不是使用其他方法?

2 个答案:

答案 0 :(得分:2)

您可以在非常有限的范围内执行此操作。诀窍是在用逗号分隔的花括号内明确调用这些构造函数,并以这种方式实例化静态数组。

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

但这种方法实际上是一场噩梦。您可以对5或10大小的数组执行此操作,但不能为50大小的数组执行此操作,或者不能执行此操作。所以更好的选择是创建另一个方法并调用它将细节作为参数传递。请记住,这仅适用于您提出的静态数组。对于比静态更频繁使用的动态数组,即使此方法也不适用。

C ++不允许您使用另一种方法来调用您选择的构造函数。因此,应该在类中定义默认构造函数以在实例化时调用。然后,可以使用数据调用适当的方法。

另一个更好的方法是使用std :: vector。它的细节你可以在另一个类似的问题中找到。 Constructors and array of object in C++

答案 1 :(得分: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个Jacobs,那么就这样做:

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)
};