Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать массив объектов 
:(
    Опции темы
gray_k
Дата 21.8.2003, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



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


--------------------
С уважением.
Gray.
PM MAIL   Вверх
DENNN
Дата 21.8.2003, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Ищем инфу про динамические массивы, или смотрим справку по vector.
PM ICQ   Вверх
maxim1000
Дата 21.8.2003, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
HexoGenus
Дата 26.8.2003, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Максим немного некорректно объясняешь...
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;
}
//---------------------------------------------------------------------------

--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
HexoGenus
Дата 26.8.2003, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



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


--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Phantom
Дата 26.8.2003, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.8.2003

Репутация: нет
Всего: нет



Нельзя создать массив обьектов которые не имеют конструктора по умолчанию (без параметров) - так написано в умной книжке.
PM MAIL   Вверх
mr.DUDA
Дата 26.8.2003, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



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


--------------------
user posted image
PM MAIL WWW   Вверх
Phantom
Дата 26.8.2003, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.8.2003

Репутация: нет
Всего: нет



Я имел ввиду явно определенный и описанный конструктор по умолчанию, которого нет в примере HexoGenus, без него нельзя создать динамический массив обьектов.
PM MAIL   Вверх
mr.DUDA
Дата 26.8.2003, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



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




--------------------
user posted image
PM MAIL WWW   Вверх
Phantom
Дата 26.8.2003, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.8.2003

Репутация: нет
Всего: нет



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


Такой код по моему мнению (и мнению моего компилятора smile.gif ) выдает ошибку.
PM MAIL   Вверх
mr.DUDA
Дата 26.8.2003, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



А вот мой - спокойно компилит (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)



--------------------
user posted image
PM MAIL WWW   Вверх
Phantom
Дата 26.8.2003, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.8.2003

Репутация: нет
Всего: нет



Все верно, моя ошибка, зря вообще спорил. sad.gif
PM MAIL   Вверх
TaTaP
Дата 27.8.2003, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 15.10.2002

Репутация: 1
Всего: 1



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

Это сообщение отредактировал(а) TaTaP - 27.8.2003, 05:00
PM MAIL   Вверх
RAN
Дата 27.8.2003, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Да, TaTaP. Если создать конструктор в классе, то конструктор по-умолчанию тоже надо писать самому. А автору темы можно предложить ещё использовать параметры по-умолчанию.
CMyClass(int par1 = <значение по-умолчанию> ... )
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.8.2003, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Да, народ, вы правы. Каюсь.
Цитата
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];



--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.