Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
#1

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

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

есть, например, примерно следующий код:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 08:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос vector и конструторы (C++):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от Praktolock Посмотреть сообщение
Я это прекрасно понимаю. Более того, я не вижу смысла копировать экземпляр класса(в моём конкретном случае). В идеале я хочу выделить еще кусок памяти вектору и один(!) раз вызвать конструктор при создании в этом куске памяти экземпляра класса, вместо этого, вектор хочет навызывать кучу конструкторов и гонять память туда-обратно, затем всё это удалять. В результате нужна еще куча лишнего кода, который я не хочу писать. (я не опримере из первого поста, проблема возникла в проекте несколько больших масштабов)
от нас то вы что хотите, потроллить?
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
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
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.06.2013, 12:29 #14
Цитата Сообщение от Praktolock Посмотреть сообщение
struct STUSERINFO
Цитата Сообщение от Praktolock Посмотреть сообщение
struct 'STNPCINFO'
и опять мимо лунки
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
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
30.06.2013, 12:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2013, 12:35
Привет! Вот еще темы с ответами:

Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>> - C++
Добрый день, подскажите пожалуйста как лучше и проще считывать файл. в файле записаны числа, разделенные пробелами и запятыми: 1, 2, 3,...

Struct / Vector / Expression: vector subscript out of range - C++
Добрый вечер. Имеется структура: struct Contact { public: string name; vector&lt;string&gt; phoneNumber; };

При include<vector> не включает и не видит vector - C++
Не видит vector: //--ClassNeuron.h #ifndef NEURON_H #define NEURON_H #include &lt;cstdlib&gt; #include...

Записать vector<vector<wchar_t>> в текстовый файл - C++
Подскажите пожалуйста, как записать vector&lt;vector&lt;wchar_t&gt;&gt; в файл. Файл необходимо открывать через _wfopen. Пробую так, не получается....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru