Как объявить объект, который содержит массив целых - PullRequest
0 голосов
/ 07 июня 2018

(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

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 июня 2018

Я хочу объявить объект, который содержит массив целых чисел, примерно так: (псевдокод) "arr1D a1 [] = {1,2,3,4,5};"Это должно напечатать что-то вроде этого: "arr: 1 2 3 4 5 size: 5" Спасибо за помощь!

Вы можете использовать это, имея конструктор списка инициализатора в вашем классе.

Что-то вроде следующего:

#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...

См. В прямом эфире ЗДЕСЬ

Обратите внимание, что вам также нужен дисторкторв классе 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<>.Если вы не знаете, как это работает, см. этот вопрос .

Редактировать : поскольку упоминание @MM о передаче std::initializer_list по значению подходит, а не по ссылкеотредактировал конструктор класса.

...