我正在开发一个处理具有多个类的库部分数据的项目。这里有一个类的兴趣界面就是这个。
class Author
{
private:
//data members
public:
Author (string _name) ;
Author (string _name, int _books) ;
} ;
数据至少包含作者的姓名,而且没有。书籍可能会出现。我自然不能拥有默认构造函数。但是如果像这样创建一个静态数组。
Author auth_arr[100] ;
由于缺少默认构造函数,编译器给出了错误。但这种说法也是无效的。
Author auth_arr[100] ("Jacob") ;
是否有任何方法可以创建此数组并调用我选择的构造函数,而不是使用其他方法?
答案 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)
};