Для использования new[] классу необходимо задать конструктор по умолчанию.
Если очень необходимо создать динамический массив со значениями для конструктора, не совпадающими со значениями по умолчанию, можно использовать:
- функцию
init() для инициализации класса:
#include <string>
#include <iostream>
using namespace std;
class Foo {
int mNumber;
string mText;
public:
Foo(int number = 0, string text = "");
~Foo() {}
void init(int number, string text = "yo");
void print();
};
Foo::Foo(int number, string text)
: mNumber(number), mText(text)
{}
void Foo::init(int number, string text)
{
mNumber = number;
mText = text;
}
void Foo::print()
{
cout << "Number: " << mNumber << "\tText: " << mText << endl;
}
int main()
{
Foo static_obj(10, "Hello world");
Foo* dynamic;
dynamic = new Foo(13);
static_obj.print();
dynamic->print();
delete dynamic;
cout << "==========================================\n";
dynamic = new Foo[10];
for (int i = 0; i < 10; ++i) dynamic[i].print();
cout << "==========================================\n";
for (int i = 0; i < 10; ++i) {
dynamic[i].init(12);
dynamic[i].print();
}
delete[] dynamic;
return 0;
}
- статические члены + соответствующая им статическая функция типа
class Foo {
static int mDefaultNumber;
static string mDefaultText;
// ...
public:
Foo(int number = 0, string text = "");
static void set_default(int number, string text);
// ...
};
int Foo::mDefaultNumber;
string Foo::mDefaultText;
Foo::Foo(int number, string text)
{
mNumber = number ? number : mDefaultNumber;
mText = text ? text : mDefaultText;
}
void Foo::set_default(int number, string text)
{
mDefaultNumber = number;
mDefaultText = text;
}
P.S. Вообще вместо динамических массивов желательно юзать
vector.