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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический класс 
:(
    Опции темы
Fixin
Дата 22.7.2004, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Привет народ!
Такая гадость: при создании динамического массива классов (malloc, calloc) не работают конструктор и деструктор! Что делать-то? Вот пример:
Class myclass
{
public:
int I;
myclass()
{
I = 0;
}
};
func ()
{
myclass* pMClass = (myclass*)calloc(10, sizeof(myclass));
}

после этого pMClass[0].I может быть равно какому-нибудь бреду, вроде -42987324, хотя calloc должен обнулять выделяемую память!

PM MAIL ICQ   Вверх
<Spawn>
Дата 22.7.2004, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Fixin На сколько я знаю, экземпляр класса в Си создается при помощи new.

Это сообщение отредактировал(а) <Spawn> - 22.7.2004, 22:02


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
srd
Дата 23.7.2004, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



malloc/free - это функции из библиотеки языка Си и ничего не знают о конструкторах и деструкторах. Если ты пишешь на Си++, то используй только операторы new и delete. Даже если выделяешь память не для объекта класса, а для простого int.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Hroft
Дата 23.7.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да и вообще надо пользовать std::vector<myclass> my_class_arr(count). Как раз конструктор по умолчанию свой пишешь.
PM MAIL ICQ   Вверх
Fixin
Дата 23.7.2004, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Привет!
Я кое-что выяснил: у меня в классе есть динамический массив другого, внутреннего класса. Calloc выделяет область, где есть расчет только на !указатель! внутреннего класса, а когда я создаю внутренний динамический массив, область внут. идет следом за памятью текущего индекса массива главного класса. Поэтому происходит налезание на след. элемент.
Class myclass2
{
public:
int j;
};

Class myclass
{
public:
int i;
myclass2* pMClass2;
void Func(void)
{
pMClass2 = (myclass2*)calloc(i, sizeof(myclass2));
}
};

void MainFunc()
{
myclass* pMClass = (myclass*)calloc(10, x*sizeof(myclass2)+sizeof(myclass));
}

вроде так, но это еще нужно проверить.

Цитата
Да и вообще надо пользовать std::vector<myclass> my_class_arr(count). Как раз конструктор по умолчанию свой пишешь.


Не люблю готовые решения и библиотеки. в другом случае можно просто использовать один билдер.

Цитата
На сколько я знаю, экземпляр класса в Си создается при помощи new.


Я создаю массив а не экземпляр.

Цитата
malloc/free - это функции из библиотеки языка Си и ничего не знают о конструкторах и деструкторах. Если ты пишешь на Си++, то используй только операторы new и delete. Даже если выделяешь память не для объекта класса, а для простого int.


А знать им совсем не обязательно. Конструктор выполняет программа при создании экземпляра
во время работы. А в моем случае calloc обнуляет все после создания поэтому все будет равно нулю. А почему получился этот бред я объяснил выше.

Это сообщение отредактировал(а) Fixin - 23.7.2004, 20:59
PM MAIL ICQ   Вверх
gray_k
Дата 23.7.2004, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
Не люблю готовые решения и библиотеки. в другом случае можно просто использовать один билдер.

А STD поддерживают все компиляторы Си++. Это стандарт.

Цитата
Я создаю массив а не экземпляр.


Ты создаёшь массив указателей. И вообще по стандарту надо использовать new и delete.


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


Лентяй
***


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

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



Цитата
А STD поддерживают все компиляторы Си++.


STL smile.gif.

Цитата
Не люблю готовые решения и библиотеки. в другом случае можно просто использовать один билдер.


Тогда malloc тоже не используй! Это тоже часть стандартной библиотеки С++ (как и STL).

Цитата
Конструктор выполняет программа при создании экземпляра
во время работы.


Не знаю, что ты называешь конструктором, но если говорить в терминах С++, то конструктор - это специальный метод класса, который вызывается только неявно при создании классов. А значит либо при помощи new, либо при создании переменной на стеке, ну и при создании глобальной переменной.

Короче, если ты работаешь с классами, то используй new/delete и только их. Разве что кроме тех случаев, где ты хочешь создать хитрый менеджмент памяти (тогда придется использовать placement new).


--------------------
Волны гасят ветер...
PM MAIL   Вверх
chipset
Дата 24.7.2004, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата
STL .

имхо он имел в виду namespace std.
Хотя в общем ты прав..
Цитата
Тогда malloc тоже не используй! Это тоже часть стандартной библиотеки С++ (как и STL).

Нифига не используй а пиши на асме! hehe.gif
Код
myclass* pMClass = (myclass*)calloc(10, x*sizeof(myclass2)+sizeof(myclass));

IMHO бред...

Это сообщение отредактировал(а) chipset - 24.7.2004, 08:32


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fixin
Дата 24.7.2004, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Научите тогда: покажите пример динамического массива классов, каждый из элементов которого, содержит дин. массив другого класса. И все это только при помощи new, и чтобы это не были ни связный список, ни вектор.
PM MAIL ICQ   Вверх
Fantasist
Дата 24.7.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Код

class A
{}

class B
{
public:
  A* m_a;
 
  B(): m_a(0);
  B(int size): m_a(0) {SetSize(size);};
 
 void SetSize(int size)
 {
     delete[] m_a;
     m_a = new A[size];
 };
}

int main()
{
  B *b=new B[10];
  delete[] b;  
}


Если хочеться создавать массив экземпляров B инициализировар их каким-то размером, который известен на этапе компиляции, можно дописать такую примочку:

Код


template <int N>
class exB:public B
{
public:
   exB(): B(N) {};
}

int main()
{
 B* b = new exB<5>[10];
}




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fixin
Дата 24.7.2004, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Я не знал, что с помощью new можно создавать массивы! Спасибо!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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