Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 02.05.2007, 23:09   #1
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Динамические массивы + перегруженный конструктор

Здравствуйте господа и дамы.
Есть класс, допустим Foo, в нем конструктор перегружен таким образом, что принимает несколько (или один) аргументов.
Собственно вопрос, как создать динамический массив элементы которого являются экземплярами этого класса.
Примеры:
можно было бы создать динамический массив, еслиб не был перегружен конструктор:
Foo* a=new Foo[12000];
можно было бы создать один экземпляр класса:
Foo* a=new Foo(23,44);
КАК создать динамический массив элементы которого являются экземплярами этого класса?
я придумал тока один вориант, корявый, но вроде рабочий:

	Foo* a=(Foo*)malloc(sizeof(Foo)*125);
	for (int i=0;i<125;i++)
	{
		a=new Foo(25);
		a++;
	}

, вроде работает, но глядя на такое срабатывает рвотный рефлекс, кто чо посоветует?
PS/ следующие танцы с бубном не помогли:
1. перестановка скобок, квадратных и круглых
2. введение дополнительных круглых скобок.
по любому компилятор ругаеца.
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 03.05.2007, 00:04   #3
jimon
 
Сообщений: n/a
Re: Динамические массивы + перегруженный конструктор

курим темку http://www.gamedev.net/community/for...opic_id=422845
 
Ответить с цитированием
Старый 03.05.2007, 01:31   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Динамические массивы + перегруженный конструктор

В общем ясно, для того чтобы инициализировать динамический массив по моему хотенью нужны дополнительные телодвижения.
А как было бы приятно написать например:
Foo* f=new Foo[128](56,124,"sobaka ne layet");
и чтоб все скомпилилось
P.S. Вообще вместо динамических массивов желательно юзать vector.
почему? или ето аксиома?
тяжело куриться, даже фильтр типа Prompt не погамает.

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

Сообщение от HolyDel
почему? или ето аксиома?
Это лекартсво от будущей головной боли, когда запаришься искать утечки памяти. Плюсом также являются полезные методы вектора, возможность использования STL algorithms и проч.
(Offline)
 
Ответить с цитированием
Старый 03.05.2007, 02:54   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Динамические массивы + перегруженный конструктор

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

Пример не поможет. Чтобы правильно использовать контейнеры STL, надо сначала про них прочитать в какой-нибудь книге по С++ или статье. Потом прочитать Скота Мейерса, чтобы избежать ошибок при использовании.
http://anatolix.naumen.ru/Books/EffectiveSTL?v=pqe

Если так хочется пример:
#include <vector>

using namespace std;

class Foo { /* ... */ };


int main()
{
	vector<Foo> myfoo;

	myfoo.reserve(100);	// выдеить память под 100 элементов
	for (int i = 0; i < 100; ++i) {
		myfoo.push_back();
		// можно использовать конструктор не по умолчанию:
		// myfoo.push_back(Foo(/* аргументы */));
	}

	return 0;
}
Об освобождении памяти можно не заботиться до тех пор, пока не будешь использовать вектор указателей.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lib_threads - динамические потоки (выполнение процедур в отдельных потоках, параллельно основной программе) minibt Библиотеки 7 15.01.2010 14:30
Динамические массивы Randomize 2D-программирование 8 06.08.2009 23:09
динамические массивы или их аналог ddwarf Основной форум 1 26.08.2008 00:18
Конструктор - Деструктор SubZer0 FAQ 6 09.08.2006 11:04


Часовой пояс GMT +4, время: 11:59.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com