(C++) Привет, у меня проблема с объявлением объекта, давайте сначала взглянем на него:
class arr1D
{
protected:
int size;
int *arr;
public:
arr1D( int a[] ):size(sizeof(a)/sizeof(a[0])), arr(new int[size])
{
for(int i = 0; i < size; i++)
{
arr[i] = a[i];
}
}
arr1D( int siz = 10 ):size(siz), arr(new int[size])
{
for( int i = 0; i < size; i++)
{
arr[i] = 0;
}
}
friend ostream & operator<<( ostream &,const arr1D &);
};
int main()
{
//arr1D *a1 = new arr1D;
//cout << *a1;
//prints "arr: 0 0 0 0 0 0 0 0 0 0 size: 10"
return 0;
}
ostream & operator<<( ostream &_return, const arr1D &a)
{
_return << "arr: ";
for(int i=0;i<a.size;i++)
{
cout << *(a.arr+i) << " ";
}
_return << "size: " << a.size;
return _return;
}
Я хочу объявить объект, содержащий массив целых чисел что-то вроде этого:
arr1D a1[] = {1,2,3,4,5}; // pseudo-code
Это должно напечатать что-то вроде этого:
arr: 1 2 3 4 5 size: 5
Спасибо за помощь!
arr1D( int a[] ) не будет работать, a является указателем в этом контексте и потерял размер, посмотрите, как это делает std::vector, или даже используйте вместо него std::vectorЯ еще никогда не использовал вектор, сейчас пытаюсь решить таким образом. Любые идеи?
не связанные, где находится диструктор?
Будьте осторожны с очень; конструкторы правильно инициализируют два члена данных, но это из-за порядок объявлений членов данных и нет из-за порядка инициализаторов в конструкторах. Члены данных инициализируются в порядке их объявления. Если вы поменяли местами int size; и int *arr;, инициализация завершится ошибкой, потому что arr будет инициализирован до инициализации size.
«Я еще никогда не использовал вектор», никогда не рано начинать использовать vector. Просто забудьте, что существуют массивы []. Также вам не нужен new для создания объектов. std::vector<int> a1 = { 1, 2, 3, 4, 5 }; - это все, что вам нужно





I want to declare an object which contains an array of integers something like this: (pseudocode) "arr1D a1[] = {1,2,3,4,5};" This should print something like this: "arr: 1 2 3 4 5 size: 5" Thanks for help!
Вы можете использовать его, имея в своем классе конструктор списка инициализаторов.
Примерно так:
#include <iostream>
#include <initializer_list>
class arr1D
{
protected:
int size;
int *arr;
public:
arr1D(std::initializer_list<int> input) : size(input.size())
{
int* temp = new int[size];
int index = 0;
for (const auto& it : input)
{
temp[index] = it;
++index;
}
arr = temp;
}
// reaming code...
Смотрите Live ЗДЕСЬ
Обратите внимание, что вам также понадобится дистрибутив в классе arr1D, иначе произойдет утечка памяти, поскольку у вас есть член-указатель в вашем классе.
В качестве альтернативы используйте умные указатели, который является умным способом обработки динамической памяти, которую вы выделяете в куче.
См. Пример решения ЗДЕСЬ
#include <iostream>
#include <initializer_list>
#include <memory>
class arr1D
{
protected:
int size;
std::unique_ptr<int[]> arr;
public:
arr1D(std::initializer_list<int> input) : size(input.size())
{
arr = std::unique_ptr<int[]>(new int[size]);
int index = 0;
for (const auto& it : input)
{
arr[index] = it;
++index;
}
}
.......
.......
std::ostream & operator<<(std::ostream &_return, const arr1D &a)
{
_return << "arr: ";
for (int i = 0; i< a.size; i++) std::cout << a.arr[i] << " ";
_return << "size: " << a.size;
return _return;
}
PS: Однако это больше подходит для работы с std::vector<>. Если вы не знаете, как это работает, см. этот вопрос.
Редактировать: Как упоминалось в @ M.M, передача std::initializer_list по значению подходит, а не по ссылке, отредактировал конструктор класса.
@ M.M Спасибо за этот ответ. это что-то интересное для меня. const& - это вообще моя привычка, но подходит не везде. Я его отредактирую.
Возможный дубликат stackoverflow.com/questions/9443957/…