forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Динамические массивы + перегруженный конструктор (http://forum.boolean.name/showthread.php?t=3273)

HolyDel 02.05.2007 23:09

Динамические массивы + перегруженный конструктор
 
Здравствуйте господа и дамы.
Есть класс, допустим 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. введение дополнительных круглых скобок.
по любому компилятор ругаеца.

alcoSHoLiK 03.05.2007 00:01

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.

jimon 03.05.2007 00:04

Re: Динамические массивы + перегруженный конструктор
 
курим темку http://www.gamedev.net/community/for...opic_id=422845

HolyDel 03.05.2007 01:31

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

P.S. Вообще вместо динамических массивов желательно юзать vector.
почему? или ето аксиома?
Цитата:

курим темку http://www.gamedev.net/community/for...opic_id=422845
тяжело куриться, даже фильтр типа Prompt не погамает.

Всем спасибо.

alcoSHoLiK 03.05.2007 02:29

Re: Динамические массивы + перегруженный конструктор
 
Цитата:

Сообщение от HolyDel
почему? или ето аксиома?

Это лекартсво от будущей головной боли, когда запаришься искать утечки памяти. Плюсом также являются полезные методы вектора, возможность использования STL algorithms и проч.

HolyDel 03.05.2007 02:54

Re: Динамические массивы + перегруженный конструктор
 
а можно тогда пример использования?
мааааленький.

alcoSHoLiK 03.05.2007 12:23

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;
}

Об освобождении памяти можно не заботиться до тех пор, пока не будешь использовать вектор указателей.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot