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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Может ли std::vector быть членом класса? и как его инициализировать 
:(
    Опции темы
Alexeis
Дата 27.9.2012, 11:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Если стандартный метод выделения памяти не подходит, то перегрузите оператор new для своего класса и выделяйте в нем память своим способом, при этом будет правильно работать инициализация объектов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Чупакабро
Дата 27.9.2012, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Alexeis @  27.9.2012,  11:36 Найти цитируемый пост)
 Если стандартный метод выделения памяти не подходит, то перегрузите оператор new для своего класса и выделяйте в нем память своим способом, при этом будет правильно работать инициализация объектов.

Надо до этого дорасти)) Начать использовать new вместо malloc. Пойду читать книжки)
И с вектором все ж таки разберусь до конца.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Alexeis
Дата 27.9.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Чупакабро @  27.9.2012,  12:51 Найти цитируемый пост)
Надо до этого дорасти)) Начать использовать new вместо malloc. Пойду читать книжки)
И с вектором все ж таки разберусь до конца. 

  По моему худший вариант смешивать С и С++ . Это чревато появлением кучи трудноуловимых ошибок. Лучше уж писать на чистом С и проводить все инициализации и перераспределения памяти руками. Т.е. всегда сам следишь за всем. Сам контролируешь время жизни структур данных и последовательность инициализации. Или же совсем забыть про С как про страшный сон и даже перестать использовать указатели в явном виде (Использовать классы, которые сами следят за своей памятью, которую они выделили в куче). 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
baldina
Дата 27.9.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Чупакабро @  27.9.2012,  11:51 Найти цитируемый пост)
Начать использовать new вместо malloc

лучше заменить ручное распределение памяти на контейнеры:
Код

class PhNode
{
...
    size_t n;
    Mesh *pMesh;
...
public:
...
    PhNode (size_t n, Mesh* pm) : n(n), pMesh(pm) {}
...
};

std::vector <PhNode> pNodes;
std::vector <Mesh*> pPhMeshes;

void LoadPhysObj(LPCWSTR filename, vertex** pvertices, DWORD** pindices) {
...
    Mesh *pm = new Mesh;
    pPhMeshes.push_back (pm);
    pNodes.push_back (PhNode(pNodes.count(), pm));
...
}


Это сообщение отредактировал(а) baldina - 27.9.2012, 13:10
PM MAIL   Вверх
Чупакабро
Дата 27.9.2012, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну вот я начал потихоньку заменять все на контейнеры, поэтому собственно тема и образовалась
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
bsa
Дата 27.9.2012, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чупакабро, начинать надо не изнутри, а снаружи. А по хорошему, почитай хорошую литературу, список приведен в "Ответах на часто задаваемые вопросы" (тема закреплена в разделе).
PM   Вверх
rodnover
Дата 27.9.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Чупакабро @  27.9.2012,  15:24 Найти цитируемый пост)
Mesh это просто структура, не класс.

В С++ структура от класса отличается только тем, что в структуре члены класса по умолчанию публичные, а в классе приватные (если в новом, стандарте, конечно, этого не понимали)

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

Все операторы, фактически, являются функциями, начинающимися с [b]operator[b]. в итоге 

Код

mesh->separatingAxis = std::vector<XMFLOAT33>();

преобразуется к виду (как примерный показательный вариант)

Код

void operator=(mesh->separatingAxis, std::vector<XMFLOAT33>())


где функция operator= просто копирует определенным образом объект из второго параметра в объект из первого параметра. Но, если первый параметр был выделене без инициализации (malloc), он будет скопирован в мусор.

Поэтому все объекты в С++ надо выделять через оператор new, а удалять через delete.

P.S. Для инициализации массивов объектов в С++ существует оператор new[] и обратный оператор delete []

Код

Mech a* = new Mech[15]; // Создаем массив из 15 Mech
delete []; // удаляем все 15 Mech

PM MAIL   Вверх
bsa
Дата 27.9.2012, 21:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(rodnover @  27.9.2012,  20:31 Найти цитируемый пост)
delete []; // удаляем все 15 Mech

 smile 
PM   Вверх
baldina
Дата 28.9.2012, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



// удаляем все

PM MAIL   Вверх
borisbn
Дата 29.9.2012, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



bsa, baldina, т.е. это
> Mech a* = new Mech[15]
вас не смутило?

Это сообщение отредактировал(а) borisbn - 29.9.2012, 00:50


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 29.9.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 

Цитата(borisbn @ 29.9.2012,  00:48)
bsa, baldina, т.е. это
> Mech a* = new Mech[15]
вас не смутило?

Ну очипятка же.. что вы, право слово!

Это сообщение отредактировал(а) NoviceF - 29.9.2012, 13:08
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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