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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конструктор копий и STL 
:(
    Опции темы
Madest
Дата 24.3.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть класс AAA.
В нем есть BYTE* pb и метод f(аргументы), где pb выделяется память.

vector<AAA> v;
AAA aaa;
CString s;
for(int x=0;x<10;x++)
{
aaa.f(аргументы);
v.push_back(aaa);
}

адрес pb иногда одинаковый и наверное поэтому вылетает на строке v.push_back(aaa);. Почему адрес одинаковый? Конструктор копий есть. Может в нем не так чего написал?

AAA::AAA(const AAA& a)
{
pb=a.pb;
}

Причем, если закомментировать добавление к вектору - адрес pb везде разный. И еще: добавил в конструктор копий AfxMessageBox, так при увеличении x в цикле увеличивается количество вызовов конструктора копий при v.push_back(aaa);. Почему?

Это сообщение отредактировал(а) Madest - 24.3.2004, 15:50
--------------------
PM MAIL   Вверх
bel_nikita
Дата 24.3.2004, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
Есть класс AAA.
В нем есть BYTE* pb и метод f(аргументы), где pb выделяется память.

Цитата
Конструктор копий есть. Может в нем не так чего написал?
Код
AAA::AAA(const AAA& a)
{
  pb=a.pb;
}

Конечно не так!!! Где выделение памяти для pb конструкторе копии???

Приведи более подробный код конструктора.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Madest
Дата 24.3.2004, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сколько памяти нужно указателям заранее неизвестно.
Вот это все что есть:

CRaster::CRaster()
{
m_pData=NULL;
m_pBMI=NULL;
BPL=0;
bit=0;
}

CRaster::CRaster(const CRaster& rz)
{
AfxMessageBox("copy const");
m_pBMI=rz.m_pBMI;
m_pData=rz.m_pData;
}
Чуствую чего-то не догоняю...

В общем вот кусок кода. Если закомментировать push_back(), адреса все разные. А с ним они друг на друга лезут, хоть и массив CRaster* сделал.

CRaster* ra=new CRaster[numrows];
for(WORD x=0;x<numrows;x++)
{
pFrame->db->row=mysql_fetch_row(pFrame->db->res);
(ra+x)->MakeBIHfromDICOM(*(pFrame->db->row+4));
s.Format("%x,%x",(ra+x)->m_pBMI,(ra+x)->m_pData);
AfxMessageBox(s);
lz.push_back(*(ra+x));
s.Format("vector - %x,%x",lz[x].m_pBMI,lz[x].m_pData);
AfxMessageBox(s);
}


Это сообщение отредактировал(а) Madest - 24.3.2004, 17:36
--------------------
PM MAIL   Вверх
sergejzr
Дата 24.3.2004, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Код

AAA::AAA(const AAA& a)
{
 pb=a.pb;
}

pb=a.pb;
естественно, что адреса одинаковые после копии(который вектор вызывает например при pushback).

такой конструктор копий можно было бы самому и не писать, по умолчанию С++ делает точно такой же.
То есть приравнивает указатели. А нам надо именно копировать содержимое.
см. выше bel_nikita

если тебе действительно никак до длинны pb не добраться, делай вектор из указателей на AAA.
Код

vector<AAA*> v;
CString s;
for(int x=0;x<10;x++)
{
AAA* aaa=new AAA();
aaa->f(аргументы);
v.push_back(aaa);
}

Цитата

добавил в конструктор копий AfxMessageBox, так при увеличении x в цикле увеличивается количество вызовов конструктора копий при v.push_back(aaa);. Почему?

С указателями такого не будет.
Посмотри, как устроен вектор и всё сразу станет понятно.

Это сообщение отредактировал(а) sergej.z - 24.3.2004, 18:30


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 24.3.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Madest
Цитата
Сколько памяти нужно указателям заранее неизвестно

А это неважно. Важно то, что в процессе выделяешь память для BYTE* pb. Я правильно тебя понял?
Соответственно в конструкторе копии ты должен заново выделить память под pb. А потом скопировать в ентот самый pb все, что надо.

Иди pb просто хранит указатель?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Madest
Дата 25.3.2004, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Большое вам спасибо!
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0888 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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