singlepost

Создание динамического массива без конструктора по умолчанию << На главную или назад  

Здравствуйте.
Как создать динамический массив класса при условии отсутствия в классе конструктора по умолчанию?

C++

9 ответов в теме “Создание динамического массива без конструктора по умолчанию”

  1. 9
    Дмитрий Федин ответил:

    а списками //cplusplus.com/reference/stl/list/или векторами //cplusplus.com/reference/stl/vector/не удобнее ли в данном случае пользоваться?

  2. 8
    Виталик Алфёров ответил:

    Александр Amikko Лебедев,
    Спасибо.
    Хитро, будем разбираться.

  3. 7
    Александр Лебедев ответил:

    Можно выделить буфер под массив, а потом инициализировать его, вызывая размещающую операцию new для каждого объекта, при этом задействуется конструктор "не по умолчанию".

    //Main.cpp
    #include <iostream>
    #include <string>

    class MyClass
    {
    std::string m_str;
    public:
    MyClass(const char* str)
    :m_str(str)
    {}

    std::string GetString()
    {
    return m_str;
    }
    };

    int main()
    {
    //на сколько элементов выделить память
    const size_t bufSize= 100;

    //сколько из них мы инициализируем
    const size_t countToInitialize= 5;

    //сколько памяти займёт массив, если считать в char'ах:
    const size_t charsCount= sizeof(MyClass)*bufSize;

    //выделяем буфер в динамической памяти, получаем указатель на него;
    //приводим к указателю на наш класс
    MyClass* pbuf= reinterpret_cast<MyClass*>(new char [charsCount]);

    //А теперь инициализируем, например countToInitizlize первых элементов.
    //Размещающий оператор new не выделяет память, а только
    //вызывает конструктор для объекта. Конструирует объект в
    //уже выделенной памяти, указатель на которую передаётся
    //в скобках после new
    char inputBuffer[256];
    for (size_t i= 0; i<countToInitialize; i++)
    {
    std::cout<<"input string!–>";
    std::cin>>inputBuffer;

    new(&pbuf[i]) MyClass(inputBuffer);
    }

    //Ну и выведем дынные из инициализированных элементов (а вот с теми
    //элементами массива, которые не инициализированы нельзя работать
    //никаким образом, это пока сырая память.)
    std::cout<<"\n\n\n";
    for (size_t i= 0; i<countToInitialize; i++)
    {
    std::cout<<"String from my object "<<i+1<<": "
    <<pbuf[i].GetString()<<std::endl;
    }
    }

    P.S. Но я бы не стал так извращаться ;-) ) Лучше используй контейнер какой-нибудь из STL вместо древних встроенных массивов…

  4. 6
    Константин Смотритель ответил:

    Перегрузи операторы new[]/delete[]… подробнее почитай у Александреску – вроде у него было. Но внутри new всёравно будет стоять вызов malloc.

  5. 5
    Виталик Алфёров ответил:

    В другой группе предложили такой вариант, но я еще не пробовал:
    Цитата:
    >>>>
    A *mas;

    mas = (A*) new char[sizeof(A)*N];

    А затем перегружаем операцию new, так, чтобы она размещала создаваемые объекты в этом массиве, и создаём N объектов класса А с её помощью.
    <<<<

  6. 4
    Виталик Алфёров ответил:

    Дмитрий HiddenSeeker Мамонтов,
    malloc – я не умею пользоваться:D
    Как-то пробовал, но мне не понравилось((.

  7. 3
    Максим Рыбаков ответил:

    видимо нельзя, "Arrays of classes require that a default constructor be defined in the class."

  8. 2
    Дмитрий Мамонтов ответил:

    Ну, вообще-то при помощи malloc вроде выделяется.
    class c1 {public: int field1;};
    int main() {c1* p=(c1*)malloc( 20*sizeof(c1);free(p);}
    Но за информацию внутри никто не ручается.

  9. 1
    Дмитрий Мамонтов ответил:

    malloc не помогает?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.