Показать сообщение отдельно
Старый 03.05.2007, 00:01   #2
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Динамические массивы + перегруженный конструктор

Для использования 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.
(Offline)
 
Ответить с цитированием