Как объявить объект, содержащий массив целых чисел

(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

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

Возможный дубликат stackoverflow.com/questions/9443957/…

Galik 07.06.2018 20:58
arr1D( int a[] ) не будет работать, a является указателем в этом контексте и потерял размер, посмотрите, как это делает std::vector, или даже используйте вместо него std::vector
Slava 07.06.2018 20:58

Я еще никогда не использовал вектор, сейчас пытаюсь решить таким образом. Любые идеи?

justanordinaryguy 07.06.2018 21:00

не связанные, где находится диструктор?

JeJo 07.06.2018 21:01
stackoverflow.com/questions/4118025/…
Abdul Ahad 07.06.2018 21:17

Будьте осторожны с очень; конструкторы правильно инициализируют два члена данных, но это из-за порядок объявлений членов данных и нет из-за порядка инициализаторов в конструкторах. Члены данных инициализируются в порядке их объявления. Если вы поменяли местами int size; и int *arr;, инициализация завершится ошибкой, потому что arr будет инициализирован до инициализации size.

Pete Becker 07.06.2018 22:16

«Я еще никогда не использовал вектор», никогда не рано начинать использовать vector. Просто забудьте, что существуют массивы []. Также вам не нужен new для создания объектов. std::vector<int> a1 = { 1, 2, 3, 4, 5 }; - это все, что вам нужно

Caleth 07.06.2018 23:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 по значению подходит, а не по ссылке, отредактировал конструктор класса.

std::initializer_list должен передаваться по значению. глянь сюда
M.M 07.06.2018 23:10

@ M.M Спасибо за этот ответ. это что-то интересное для меня. const& - это вообще моя привычка, но подходит не везде. Я его отредактирую.

JeJo 07.06.2018 23:13

Другие вопросы по теме