Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Создать массив объектов


Автор: gray_k 21.8.2003, 16:32
Есть класс
class CMyClass
{
public:
...
CMyClass(/*здесь набор параметров*/);
}
Как в программе динамически создать массив объектов такого класса?
CMyClass *MyClassArray;
MyClassArray = new MyClassArray[N](как бы сюда набор параметров передать) такой код ругается, оно и понятно, написал чтобы было понятно, что я хочу. Как это сделать?

Автор: DENNN 21.8.2003, 16:38
Ищем инфу про динамические массивы, или смотрим справку по vector.

Автор: maxim1000 21.8.2003, 16:39
1. можно после создания в цикле пройтись по объектам и установить их параметры
2. можно объявить CMyClass **MyClassArray, тогда это будет массив указателей на объекты, потом опять же пройтись циклом и сделать MyClassArray[c] = new CMyClass(/*здесь набор параметров*/);

Автор: HexoGenus 26.8.2003, 17:59
Максим немного некорректно объясняешь...
1. После создания уже поздно, ведь параметры передаются в конструкторе smile.gif
2. **MyClassArray это еще не массив это "неинициализированный указатель на начало массива указателей" и ты начинаешь использовать этот массив не выделив под него память а это не есть гуд smile.gif
(Хотя остальное все достоверно smile.gif )
Нужно так:
Код

//---------------------------------------------------------------------------
//class CMyClass;
class CMyClass
{
int iNumber;
public:
CMyClass(int iNumberClass);
~CMyClass();
void Identification();
};
//---------------------------------------------------------------------------
CMyClass::CMyClass(int iNumberClass)
{
iNumber=iNumberClass;
ShowMessage(String("Объявлена структура №: ")+String(iNumberClass));
}
//---------------------------------------------------------------------------
CMyClass::~CMyClass()
{
ShowMessage(String("Уничтожена структура №: ")+String(iNumber));
}
//---------------------------------------------------------------------------
void CMyClass::Identification()
{
ShowMessage(String("Я структура №: ")+String(iNumber));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int N=7;
CMyClass **MyClassArray=new CMyClass*[N];
for (int i=0;i<N;i++) MyClassArray[i] = new CMyClass(i);
for (int i=0;i<N;i++) MyClassArray[i]->Identification();
for (int i=0;i<N;i++) delete MyClassArray[i];
delete MyClassArray;
}
//---------------------------------------------------------------------------

Автор: HexoGenus 26.8.2003, 18:09
Кстати это все мы создаем массивы указателей на классы ...
получается что массив классов у которых нет конструктора без параметров динамически создать нельзяconfused.gif?
(Для любителей поспорить в пустую заранее предупреждаю что под массивом классов я подразумеваю то что они расположены в памяти непосредственно друг за другом)


Автор: Phantom 26.8.2003, 21:55
Нельзя создать массив обьектов которые не имеют конструктора по умолчанию (без параметров) - так написано в умной книжке.

Автор: mr.DUDA 26.8.2003, 22:02
Конструктор без параметров существует в любом классе. Если он не объявлен в явном виде, то для инициализации объекта в массиве или контейнере используется конструктор без параметров по умолчанию (который не выполняет никаких действий, кроме инициализации объектов-полей данного объекта их конструкторами по умолчанию). Кроме того, в любом классе есть конструктор копирования и деструктор по умолчанию.

Автор: Phantom 26.8.2003, 22:07
Я имел ввиду явно определенный и описанный конструктор по умолчанию, которого нет в примере HexoGenus, без него нельзя создать динамический массив обьектов.

Автор: mr.DUDA 26.8.2003, 22:11
Phantom, ты мог бы привести пример такого динамического массива (ну или контейнера, если ты это имеешь ввиду), в котором нельзя было бы хранить, например, объекты такого класса:
Код
class  CSomeClass
{
       //     савсэм пустой, без конструкторов, да ?
};


Автор: Phantom 26.8.2003, 22:22
Код
class  CSomeClass
{
      //     савсэм пустой, без конструкторов, да!
};
...
CSomeClass *myclassarray=new CSomeClass[10];


Такой код по моему мнению (и мнению моего компилятора smile.gif ) выдает ошибку.

Автор: mr.DUDA 26.8.2003, 22:30
А вот мой - спокойно компилит (MSVC 6.0 SP4):
Код
BOOL CSomeTestDlg::OnInitDialog()
{
     // ........
     class  CSomeClass
     {
     };
     CSomeClass *myclassarray=new CSomeClass[10];

Цитата
--------------------Configuration: SomeTest - Win32 Debug--------------------
Compiling...
SomeTestDlg.cpp
Linking...

SomeTest.exe - 0 error(s), 0 warning(s)

Автор: Phantom 26.8.2003, 22:42
Все верно, моя ошибка, зря вообще спорил. sad.gif

Автор: TaTaP 27.8.2003, 04:59
mr.DUDA ты неправ - в классе по умолчанию конструктор без параметров существует лишь тогда, когда в классе вообще нет никаких конструкторов, и у членов класса и базовых классов существуют конструкторы по умолчанию (либо также нет никаких конструкторов). Если это не так - компилятор ругается...
Теперь про проблему gray_k - можно либо перегрузить в классе оператор new, либо писать конструктор по умолчанию. В MSDN прямо так и сказано - стандартным оператором new можно создавать динамические массивы объектов, только если класс имеет конструктор по умолчанию...

Автор: RAN 27.8.2003, 07:23
Да, TaTaP. Если создать конструктор в классе, то конструктор по-умолчанию тоже надо писать самому. А автору темы можно предложить ещё использовать параметры по-умолчанию.
CMyClass(int par1 = <значение по-умолчанию> ... )

Автор: mr.DUDA 27.8.2003, 09:46
Да, народ, вы правы. Каюсь.
Цитата
Compiler Error C2512
'identifier' : no appropriate default constructor available

No default constructor was available for the specified class, structure, or union.

The compiler will supply a default constructor only if user-defined constructors are not provided. If you provide a constructor that takes a nonvoid parameter, then you must also provide a default constructor. The default constructor can be called with no parameters, that is, a constructor with default values for all parameters.


ЗЫ, а еще инициализировать поля объекта можно не передавая параметров в конструктор, так:
Код
class CSome
{
public:
         int x;
         char *y;

         CSome(): x(2), y("AA")     // <--------------- вот таким вот образом
         {}
};

CSome *arr = new CSome[10];

Автор: Dan. 11.7.2004, 19:26
Ребят, можете привести готовый код для динамического создания объектов BC++B? Я в Сях пока не очень хорошо разбираюсь rolleyes.gif... Требуется создать массив TEdit'ов...

Автор: bel_nikita 11.7.2004, 21:40
gray_k
А по чему бы не создать массив указателей на объекты???
И про конструктор копий в таком случае можно забыть. Почти smile.gif
Или смысл в том, чтоб объекты в памяти хранились последовательно? Но зачем? Мне кажется лучше хранить указатели на объекты.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)