Здравствуйте.
Как создать динамический массив класса при условии отсутствия в классе конструктора по умолчанию?
C++
Здравствуйте.
Как создать динамический массив класса при условии отсутствия в классе конструктора по умолчанию?
C++
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
8 февраля 2010 в 11:03
а списками //cplusplus.com/reference/stl/list/или векторами //cplusplus.com/reference/stl/vector/не удобнее ли в данном случае пользоваться?
6 февраля 2010 в 15:03
Александр Amikko Лебедев,
Спасибо.
Хитро, будем разбираться.
5 февраля 2010 в 1:02
Можно выделить буфер под массив, а потом инициализировать его, вызывая размещающую операцию 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 февраля 2010 в 22:03
Перегрузи операторы new[]/delete[]… подробнее почитай у Александреску – вроде у него было. Но внутри new всёравно будет стоять вызов malloc.
4 февраля 2010 в 19:02
В другой группе предложили такой вариант, но я еще не пробовал:
Цитата:
>>>>
A *mas;
mas = (A*) new char[sizeof(A)*N];
А затем перегружаем операцию new, так, чтобы она размещала создаваемые объекты в этом массиве, и создаём N объектов класса А с её помощью.
<<<<
4 февраля 2010 в 19:01
Дмитрий HiddenSeeker Мамонтов,
malloc – я не умею пользоваться:D
Как-то пробовал, но мне не понравилось((.
4 февраля 2010 в 10:05
видимо нельзя, "Arrays of classes require that a default constructor be defined in the class."
4 февраля 2010 в 10:05
Ну, вообще-то при помощи malloc вроде выделяется.
class c1 {public: int field1;};
int main() {c1* p=(c1*)malloc( 20*sizeof(c1);free(p);}
Но за информацию внутри никто не ручается.
4 февраля 2010 в 10:03
malloc не помогает?