Форум программистов, компьютерный форум CyberForum.ru

vector и конструторы - C++

Восстановить пароль Регистрация
 
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 08:33     vector и конструторы #1
есть, например, примерно следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <conio.h>
#include <vector>
 
class CC
{
 int a;
public:
 CC();
 CC(CC*cc);
 CC(int c);
 ~CC();
};
 
CC::CC()
{
 printf("CC::CC()\n");
};
 
CC::CC(CC*cc)
{
 printf("CC::CC(CC*)\n");
};
 
CC::CC(int c)
{
 a=c;
 printf("CC::CC(int)\n");
};
 
CC::~CC()
{
 printf("CC::~CC()\n");
};
 
int _tmain(int argc, _TCHAR* argv[])
{
 
 std::vector<CC> n;
 n.push_back(CC(1));
 printf("size %d \n", n.size());
    return 0;
}
при этом на экране примерно такое:
CC::CC(int)
CC::~CC()
size 1
CC::~CC()
Интересно, почему деструктор вызван больше раз чем конструктор?
Ход моих мыслей: CC::CC(int) - это я делаю CC(1) в пушбаке вектора. следом за ним CC::CC~() - удаляется безымянный экземпляр которым я проинициализировал новый элемент вектора, но ведь должен и конструктор копии вызваться(?)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
iv-a
 Аватар для iv-a
15 / 15 / 0
Регистрация: 25.06.2013
Сообщений: 63
30.06.2013, 09:58     vector и конструторы #2
Цитата Сообщение от Praktolock Посмотреть сообщение
но ведь должен и конструктор копии вызваться(?)
а его нет в программе

конструктор копии:
C++
1
2
3
4
CC(const CC &copy)
{
 
}
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 10:09  [ТС]     vector и конструторы #3
странно, почему вектор требует обязательно конструкор копии, и не хочет без него компилиться впринципе, НО! если есть вот такого вида конструктор CC::CC(CC*) - всё компилится нормально, то есть его как-бы вместо конструктора копии проглатывает вектор, но вызывать его не хочет
iv-a
 Аватар для iv-a
15 / 15 / 0
Регистрация: 25.06.2013
Сообщений: 63
30.06.2013, 10:21     vector и конструторы #4
этих тонкостей я уже не знаю, почему вектор требует обязательно конструктор копии

Добавлено через 1 минуту
может быть при добавлении нового элемента в вектор n.push_back(CC(1)); вызывается этот конструктор
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 10:43  [ТС]     vector и конструторы #5
ну почему он его требует, в принципе, объяснимо, но вот почему вместо него прокатывает другой конструктор, который впоследствии не используется, это мне не ясно совсем

Добавлено через 11 минут
походу, при наличии конструктора CC::CC(CC*) компилятор сам зачем-то создаёт свой конструктор копии, в противном случае не хочет

Добавлено через 10 минут
щас вообще без конструкторов компилится - ничего не понимаю
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.06.2013, 11:37     vector и конструторы #6
Цитата Сообщение от Praktolock Посмотреть сообщение
щас вообще без конструкторов компилится - ничего не понимаю
Компилятор генерирует:
1) конструктор по умолчанию (только если нет других конструкторов);
2) конструктор копирования;
3) оператор присваивания;
4) деструктор.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 11:44  [ТС]     vector и конструторы #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Компилятор генерирует:
1) конструктор по умолчанию (только если нет других конструкторов);
2) конструктор копирования;
3) оператор присваивания;
4) деструктор.
он не всегда это делает

Добавлено через 4 минуты
или всегда?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
30.06.2013, 11:55     vector и конструторы #8
По-умолчанию копирующий конструктор и оператор присваивания генерируются всегда, если они не удалены или не определены программистом, это стандарт.
Именно в таком случае следует заглядывать в стандарт, если не понятно какое-то поведение.

Вектору необходим конструктор копирования, иначе как он сохранит внутри объект, передаваемый ему по значению?
Другая альтернатива в C++11 конструктор перемещения, но он может быть применен только для rvalue reference.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 11:56  [ТС]     vector и конструторы #9
\visualstudio2008\vc\include\vector(1209) : error C2558: struct 'STNPCINFO': нет доступных конструкторов копии или конструктор копии объявлен как 'explicit'
А в каких случаях генерируемый компилятором конструктор становится "explicit"?

Добавлено через 56 секунд
Цитата Сообщение от Герц Посмотреть сообщение
Вектору необходим конструктор копирования, иначе как он сохранит внутри объект, передаваемый ему по значению?
ну так он же всегда генерится автоматом
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
30.06.2013, 11:57     vector и конструторы #10
Ни в каких.
ну так он же всегда генерится автоматом
Если ты удалишь этот конструктор или напишешь его сам - не сгенерится.
Большинство классов, хранящих внутри себя указатели и/или системные ресурсы нуждаются в нетривиальном конструкторе копирования.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 12:07  [ТС]     vector и конструторы #11
Цитата Сообщение от Герц Посмотреть сообщение
Ни в каких.
Каким же образом рождается ошибка компилятора, когда вектор не видит конструктор копирования, который генерируется "всегда" и "ни в каких" случаях не бывает "explicit"

Добавлено через 7 минут
Цитата Сообщение от Герц Посмотреть сообщение
Большинство классов, хранящих внутри себя указатели и/или системные ресурсы нуждаются в нетривиальном конструкторе копирования.
Я это прекрасно понимаю. Более того, я не вижу смысла копировать экземпляр класса(в моём конкретном случае). В идеале я хочу выделить еще кусок памяти вектору и один(!) раз вызвать конструктор при создании в этом куске памяти экземпляра класса, вместо этого, вектор хочет навызывать кучу конструкторов и гонять память туда-обратно, затем всё это удалять. В результате нужна еще куча лишнего кода, который я не хочу писать. (я не опримере из первого поста, проблема возникла в проекте несколько больших масштабов)
Цитата Сообщение от Герц Посмотреть сообщение
Если ты удалишь этот конструктор или напишешь его сам - не сгенерится.
Не удалял, не писал его сам
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.06.2013, 12:27     vector и конструторы #12
Цитата Сообщение от Praktolock Посмотреть сообщение
Каким же образом рождается ошибка компилятора, когда вектор не видит конструктор копирования, который генерируется "всегда" и "ни в каких" случаях не бывает "explicit"
а что такое
Цитата Сообщение от Praktolock Посмотреть сообщение
struct 'STNPCINFO'
?

Цитата Сообщение от Praktolock Посмотреть сообщение
Я это прекрасно понимаю. Более того, я не вижу смысла копировать экземпляр класса(в моём конкретном случае). В идеале я хочу выделить еще кусок памяти вектору и один(!) раз вызвать конструктор при создании в этом куске памяти экземпляра класса, вместо этого, вектор хочет навызывать кучу конструкторов и гонять память туда-обратно, затем всё это удалять. В результате нужна еще куча лишнего кода, который я не хочу писать. (я не опримере из первого поста, проблема возникла в проекте несколько больших масштабов)
от нас то вы что хотите, потроллить?
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 12:29  [ТС]     vector и конструторы #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct STUSERINFO
{
 DWORD   id;
 wchar_t name [_STRINGLENGTH];
 int     x;
 int     y;
 int     z;
 
 enum ECURACTION{none,move,atack}state;
 DWORD   targetid;
 STGRAPHOBJECT gr;
 STUSERINFO();
};
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.06.2013, 12:29     vector и конструторы #14
Цитата Сообщение от Praktolock Посмотреть сообщение
struct STUSERINFO
Цитата Сообщение от Praktolock Посмотреть сообщение
struct 'STNPCINFO'
и опять мимо лунки
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 12:35  [ТС]     vector и конструторы #15
Цитата Сообщение от Jupiter Посмотреть сообщение
от нас то вы что хотите, потроллить?
Узнать
Цитата Сообщение от Praktolock Посмотреть сообщение
Каким же образом рождается ошибка компилятора, когда вектор не видит конструктор копирования, который генерируется "всегда" и "ни в каких" случаях не бывает "explicit"
Добавлено через 1 минуту
Вот такую ошибку выдает
Цитата Сообщение от Praktolock Посмотреть сообщение
\visualstudio2008\vc\include\vector(1209) : error C2558: struct 'STNPCINFO': нет доступных конструкторов копии или конструктор копии объявлен как 'explicit'
Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
и опять мимо лунки
Я извиняюсь, нито, но они аналогичные

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct STNPCINFO
{
 DWORD id;
 DWORD type_id;
 int   x;
 int   y;
 int   z;
 
 STGRAPHOBJECT gr;
 STNPCINFO();
};
 
STNPCINFO::STNPCINFO()
{
  id=0;
};
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.06.2013, 12:50     vector и конструторы #16
@Praktolock, http://codepad.org/1uISrLln
STGRAPHOBJECT умеет себя копировать?
без кода который повторяет проблему трудно что либо сказать.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
30.06.2013, 16:59  [ТС]     vector и конструторы #17
судя по всему в STGRAPHOBJECT дело

Добавлено через 20 минут
я тут панавыдёргивал и собрал всё в 1 кучу. вот в таком виде компилится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
 
struct STVERTEX3
{
 double x, y, z;
 STVERTEX3();
 STVERTEX3(STVERTEX3&_v);
 STVERTEX3(double _x, double _y, double _z);
};
STVERTEX3::STVERTEX3(){x=0;y=0;z=0;};
STVERTEX3::STVERTEX3(STVERTEX3&_v){x=_v.x;y=_v.y;z=_v.z;};
STVERTEX3::STVERTEX3(double _x, double _y, double _z){x=_x;y=_y;z=_z;};
 
struct STGRAPHOBJECT
{
 CRITICAL_SECTION cs;
 //STVERTEX3 pos;
 //STVERTEX3 basis;
 int       points, frames, polygones;
 STVERTEX3*point;
 DWORD*    polygon;
 TCHAR     name[30];
 STGRAPHOBJECT();
 ~STGRAPHOBJECT();
 void Lock();
 void Unlock();
};
STGRAPHOBJECT::STGRAPHOBJECT()
{
 InitializeCriticalSection(&cs);
};
STGRAPHOBJECT::~STGRAPHOBJECT()
{
 DeleteCriticalSection(&cs);
};
 
 
struct STNPCINFO
{
 DWORD id;
 DWORD type_id;
 int   x;
 int   y;
 int   z;
 
 STGRAPHOBJECT gr;
 STNPCINFO();
};
STNPCINFO::STNPCINFO()
{
 id=0;
};
 
int main()
{
 std::vector<STNPCINFO>vect;
 vect.push_back(STNPCINFO());
 
 getch();
    return 0;
}
елси разкомментировать строки (ну или одну из них :-))
C++
1
2
 //STVERTEX3 pos;
 //STVERTEX3 basis;
то выдаст ту самую ошибку
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.06.2013, 17:20     vector и конструторы #18
Цитата Сообщение от Praktolock Посмотреть сообщение
C++
1
STVERTEX3::STVERTEX3(STVERTEX3&_v){x=_v.x;y=_v.y;z=_v.z;};
этот конструктор не нужен, убери его и проблем не будет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 02:35     vector и конструторы
Еще ссылки по теме:

C++ Запись в vector<vector<char>>
C++ Не работает функция sort (vector, vector)
Сортировка vector<vector<int>> C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
01.07.2013, 02:35  [ТС]     vector и конструторы #19
так и сделал, любопытно узнать почему с ним не работает ничего?
Yandex
Объявления
01.07.2013, 02:35     vector и конструторы
Ответ Создать тему
Опции темы

Текущее время: 08:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru