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。您可以在此处的另一个类似问题中找到它的详细信息。 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个Jacobs,那么就这样去做吧:

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

[更新1]

但是,这仅适用于本地数组。通过一个小技巧,您可以将它用于静态/全局数组。我不打算介绍它-因为还有另一种解决方案可以在没有默认构造函数的情况下制作静态类数组,我从您的评论中了解到这是您的目标;)几乎没有宏的帮助,您甚至可以生成数千个对象:

#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 回答