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

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

Войти
Регистрация
Восстановить пароль
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
#1

Стандартный векторный контейнер - C++

14.08.2013, 17:09. Просмотров 489. Ответов 7
Метки нет (Все метки)

"Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete(), т.е. для создания нового элемента вызывается стандартный конструктор класса Т. Это служит еще одним аргументом в пользу явного определения стандартного конструктора в создаваемых классах. Если этого не сделать, то нельзя будет использовать стандартный векторный контейнер для хранения объектов пользовательского класса"
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса? Ведь, стандартный конструктор класса, даже, если мы его не определили, он все равно создается компилятором.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 17:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стандартный векторный контейнер (C++):

Класс как стандартный контейнер - C++
Здорова господа! Опять есть условие задачи: Напишите такие классы, чтобы Vector из 16.2.1 и Vector из 16.2.2 могли использоваться как...

Приватный конструктор и стандартный контейнер. Два барана на мосту - C++
Всем суп! Итак, банальная вещь - в заголовке - не желает компилироваться. Суть, немного упрощённая, такова: class AAA { private: ...

Векторный калькулятор на классах - C++
Привет всем. Преподаватель дал задание, написать векторный калькулятор на классах. На массивах в консоли я сделал для 4 операций, но как...

Перевести обычный массив в векторный - C++
#include <iostream> #include <stdlib.h> #include <math.h> #include <time.h> using namespace std; int main() { int min =...

дана матрица А(5,5). Получить векторный столбец, элементы которого являются наибольшими по модулю элементов исходной матрицы - C++
дана матрица А(5,5). Получить векторный столбец, элементы которого являются наибольшими по модулю элементов исходной матрицы

Двумерный динамический массив (Получить векторный столбец, элементы которого являются наименьшим по модулю столбцов исходной матрицы) - C++
Подскажите, что делаю не так. Задание такое: Дана матрица A(n,m). Получить векторный столбец, элементы которого являются наименьшим по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13232 / 7504 / 846
Регистрация: 27.09.2012
Сообщений: 18,433
Записей в блоге: 3
Завершенные тесты: 1
14.08.2013, 17:15 #2
Цитата Сообщение от Erjay Посмотреть сообщение
Ведь, стандартный конструктор класса, даже, если мы его не определили, он все равно создается компилятором.
Если только нет других конструкторов
Цитата Сообщение от Erjay Посмотреть сообщение
Если этого не сделать, то нельзя будет использовать стандартный векторный контейнер для хранения объектов пользовательского класса"
Почему?
1
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
14.08.2013, 17:18  [ТС] #3
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему?
То есть, все таки, можно будет?! Это, кстати, из книги Либерти.
0
Croessmah
Эксперт CЭксперт С++
13232 / 7504 / 846
Регистрация: 27.09.2012
Сообщений: 18,433
Записей в блоге: 3
Завершенные тесты: 1
14.08.2013, 17:27 #4
Цитата Сообщение от Erjay Посмотреть сообщение
То есть, все таки, можно будет?
http://ideone.com/0MedUY
Цитата Сообщение от Erjay Посмотреть сообщение
Обычно элементы создаются с помощью оператора new() и освобождаются с помощью оператора delete()
не факт!
1
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.08.2013, 18:07 #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
class A
{
public:
   A(int x_)
       :x(x_)
   {}
 
private:
   int x ;
} ;
 
int main()
{
   std::vector<A>   vec(5);
}
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
14.08.2013, 18:25 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
class A
{
public:
   A(int x_)
       :x(x_)
   {}
 
private:
   int x ;
} ;
 
int main()
{
   std::vector<A> vec(5,4); // size=5, val=4;
}
C++
1
2
explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
http://www.cplusplus.com/reference/v...vector/vector/
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
14.08.2013, 18:31 #7
Erjay, у шаблона вектор много конструкторов и не обязательно требовать наличие конструктора по умолчанию. Тему проще понять на примере инициализации динамического массива.
Дело в том, что при выделении памяти под переменную одиночного значения, язык предоставляет возможность сразу его инициализировать необходимым значением:
C++
1
int *b = new int(123);//выделение и инициализация. Для динамических массивов это невозможно.
но нет возможности так поступить с массивом. Нельзя написать, что-то похожее на:
C++
1
int *c = new int[]({1, 2, 3});  //было бы удобно но ничего подобного нет)
Возможна, например запись:
C++
1
int *c = new int[3];
которая не в состоянии принять каких либо значений для инициализации, она только выделяет память. Для int например, эта память вообще не инициализируется и содержит мусор.
Зато если есть конструктор по умолчанию (от компилятора или определённый явно, неважно), то компилятор знает что ему делать видя запись:
C++
1
MyClass *d = new MyClass[3];
Оператор выделения памяти трижды вызовет конструктор по умолчанию.
1
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
14.08.2013, 18:36 #8
Цитата Сообщение от Erjay Посмотреть сообщение
Вопрос: почему для использования стандартного векторного контейнера необходимо явно определять стандартный конструктор класса?
Для того что бы в дальнейшем не думать откуда ошибки лезут...

Если конструируешь класс то нужно предусмотреть стандартный, полный и понятный интерфейс для другого программиста...
Если "конструкция" изначально специфическая то естественно чего-то может не быть или работать не стандартно, в том числе какого-то конструктора может не быть...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2013, 18:36
Привет! Вот еще темы с ответами:

Перевести на стандартный С++ - C++
class TActivator; typedef void (__closure *TTriggerProc)(TActivator *Sender); struct TRecepient{ TTriggerProc OnProc; ...

Стандартный класс complex. - C++
1)Есть ли стандартный не шаблонный класс complex? Я нашел только шаблонный класс, определенный в заголовочном файле &lt;complex&gt; Есть ли...

Стандартный входной поток - C++
Добрый день, помогите разобраться. Хочу написать функцию, которая читает из входного потока некое количество данных вида...

Стандартный поток ввода - C++
Доброго времени суток. Допустим есть код: double d; cin &gt;&gt; d; Допустим, в потоке ввода символы &quot;12.e&quot;, поток...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.08.2013, 18:36
Ответ Создать тему
Опции темы

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