
Другие языки программирования и технологии
C++ массив array в классе
Почему нельзя инициализировать массив в классе (на скрине). Вектор например могу, а массив не могу. В main тоже можно.


У массива это не список инициализации!
std::vector<int> v({1,2,3,4,5}); // good!
std::array<int,5> a({1,2,3,4,5}); // error!
Класс array<T> относится к агрегатам. Он не имеет пользовательских конструкторов, закрытых или защищённых не статических членов, базовых классов и виртуальных функций. То есть всё открыто и всё доступно!
Внутри класса создаётся статический массив в стиле Си, он будет расположен в стеке со всеми вытекающими отсюда последствиями.
Конструктор по умолчанию не создаёт пустой контейнер, так как количество элементов заранее известно, оно постоянно и неизменно во время выполнения программы.
Это то, что касается подчёркивания красным в среде Visual Studio 2013 попытке инициализировать списком объект контейнера в классе. Но вовсе не значит, что для vector код валиден.... Совсем даже наоборот! Компилятор выдаст ошибку компиляции: C2797 https://msdn.microsoft.com/ru-ru/library/dn793970 для любой попытки инициализировать список в списке инициализаторов члена или нестатического члена данных, как для массива, так и для вектора и чего угодно.
Ну и для наглядности код, который покажет и докажет внутреннюю структуру класса array<T>
#include <iostream>
#include <vector>
#include <array>
using namespace std;
struct test {
vector<int> v{};
array<int, 5> a{};
};
int main() {
test t;
for (auto &e : t.a) cout << e << ' '; // что и требовалось доказать!
cout << endl;
for (auto &e : t.v) cout << e << ' ';
cin.sync();
cin.get();
}
std::vector<int> v({1,2,3,4,5}); // good!
std::array<int,5> a({1,2,3,4,5}); // error!
Класс array<T> относится к агрегатам. Он не имеет пользовательских конструкторов, закрытых или защищённых не статических членов, базовых классов и виртуальных функций. То есть всё открыто и всё доступно!
Внутри класса создаётся статический массив в стиле Си, он будет расположен в стеке со всеми вытекающими отсюда последствиями.
Конструктор по умолчанию не создаёт пустой контейнер, так как количество элементов заранее известно, оно постоянно и неизменно во время выполнения программы.
Это то, что касается подчёркивания красным в среде Visual Studio 2013 попытке инициализировать списком объект контейнера в классе. Но вовсе не значит, что для vector код валиден.... Совсем даже наоборот! Компилятор выдаст ошибку компиляции: C2797 https://msdn.microsoft.com/ru-ru/library/dn793970 для любой попытки инициализировать список в списке инициализаторов члена или нестатического члена данных, как для массива, так и для вектора и чего угодно.
Ну и для наглядности код, который покажет и докажет внутреннюю структуру класса array<T>
#include <iostream>
#include <vector>
#include <array>
using namespace std;
struct test {
vector<int> v{};
array<int, 5> a{};
};
int main() {
test t;
for (auto &e : t.a) cout << e << ' '; // что и требовалось доказать!
cout << endl;
for (auto &e : t.v) cout << e << ' ';
cin.sync();
cin.get();
}
потому что сама переменная типа класс сразу не создается, в памяти только его структура и методы.
а переменная создается уже в коде. используй конструктор для инициализации.
а переменная создается уже в коде. используй конструктор для инициализации.
Константин Горохов
Не понимаю. Но ведь список инициализации как раз и относится к синтезируемому конструктору.
Вот с вектором такое работает.
Почему с вектором работает а с массивом нет?
Вот с вектором такое работает.
Почему с вектором работает а с массивом нет?

Похожие вопросы
- Как в C# инициализировать массив в свойстве класса?
- Опишите по человечески как работает массив array (записывать в массив и извлекать из него) . Чет немного туплю. Помогите
- C++ массивы. Пожалуйста, помогите!
- как в C++ массив чисел преобразовать в строку
- c++, массивы, строки
- программирование c# массивы
- Задания C# (массивы, матрицы).
- C++ Двухмерный массив с случайными не повторяющимися числами.
- Всем привет. Никак не могу понять динамически массивы в C++.
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
А в Code::Blocks (mingw-64) ошибки нет.
Если я правильно понял то запись
array arr = {1, 2, 3, 4, 5}
подразумевает создание массива определенного размера и копирование этих чисел в него, а запись
array arr{1,2,3,4,5} недопустима, потому что происходит попытка вызвать конструктор принимающий список инициализации (которого не существует)?