Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
1

vector и конструторы

30.06.2013, 08:33. Показов 1900. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть, например, примерно следующий код:
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~() - удаляется безымянный экземпляр которым я проинициализировал новый элемент вектора, но ведь должен и конструктор копии вызваться(?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2013, 08:33
Ответы с готовыми решениями:

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало...

Цикл: Создайте класс Matrix на базе вектора vector<vector<int>>.
Создайте класс Matrix на базе вектора vector&lt;vector&lt;int&gt;&gt;. Определите операторную функцию ostream\&amp;...

Ошибка [Linker error] undefined reference to `Vector::Vector(int)'
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include...

18
15 / 15 / 8
Регистрация: 25.06.2013
Сообщений: 63
30.06.2013, 09:58 2
Цитата Сообщение от Praktolock Посмотреть сообщение
но ведь должен и конструктор копии вызваться(?)
а его нет в программе

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

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

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

Добавлено через 10 минут
щас вообще без конструкторов компилится - ничего не понимаю
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.06.2013, 11:37 6
Цитата Сообщение от Praktolock Посмотреть сообщение
щас вообще без конструкторов компилится - ничего не понимаю
Компилятор генерирует:
1) конструктор по умолчанию (только если нет других конструкторов);
2) конструктор копирования;
3) оператор присваивания;
4) деструктор.
1
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
30.06.2013, 11:44  [ТС] 7
Цитата Сообщение от 0x10 Посмотреть сообщение
Компилятор генерирует:
1) конструктор по умолчанию (только если нет других конструкторов);
2) конструктор копирования;
3) оператор присваивания;
4) деструктор.
он не всегда это делает

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

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

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

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

Цитата Сообщение от Praktolock Посмотреть сообщение
Я это прекрасно понимаю. Более того, я не вижу смысла копировать экземпляр класса(в моём конкретном случае). В идеале я хочу выделить еще кусок памяти вектору и один(!) раз вызвать конструктор при создании в этом куске памяти экземпляра класса, вместо этого, вектор хочет навызывать кучу конструкторов и гонять память туда-обратно, затем всё это удалять. В результате нужна еще куча лишнего кода, который я не хочу писать. (я не опримере из первого поста, проблема возникла в проекте несколько больших масштабов)
от нас то вы что хотите, потроллить?
1
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
30.06.2013, 12:29  [ТС] 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();
};
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.06.2013, 12:29 14
Цитата Сообщение от Praktolock Посмотреть сообщение
struct STUSERINFO
Цитата Сообщение от Praktolock Посмотреть сообщение
struct 'STNPCINFO'
и опять мимо лунки
1
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
30.06.2013, 12:35  [ТС] 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;
};
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.06.2013, 12:50 16
@Praktolock, http://codepad.org/1uISrLln
STGRAPHOBJECT умеет себя копировать?
без кода который повторяет проблему трудно что либо сказать.
1
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
30.06.2013, 16:59  [ТС] 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;
то выдаст ту самую ошибку
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.06.2013, 17:20 18
Цитата Сообщение от Praktolock Посмотреть сообщение
C++
1
STVERTEX3::STVERTEX3(STVERTEX3&_v){x=_v.x;y=_v.y;z=_v.z;};
этот конструктор не нужен, убери его и проблем не будет
1
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
01.07.2013, 02:35  [ТС] 19
так и сделал, любопытно узнать почему с ним не работает ничего?
0
01.07.2013, 02:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2013, 02:35
Помогаю со студенческими работами здесь

vector<Struct2{int,vector<struct1>}> или множественное наследование ...
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; ...

Как корректно скопировать vector в vector внутри класса
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt;...

Указатель на объект вектор в векторе vector < vector<int>* >*
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; ...

Как сложить два vector и записать в третий vector ?
Не получается сложить два вектора по элементно и записать в третий . Складываю уже переведенные...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru