Как исправить ошибку, возникающую при передаче массива в конструкторе на C++?

Как правильно передать массив в аргументы класса Array?
  • 10 февраля 2024 г. 19:28
Ответы на вопрос 2
Для передачи массива в конструктор класса в C++, вы должны использовать указатель на первый элемент массива и, возможно, размер массива (если он заранее не известен). В C++ принято использовать контейнеры из стандартной библиотеки, например `std::vector`, для работы с динамическими массивами, так как это более безопасно и удобно, чем работать с сырыми указателями и массивами в стиле C.

Вот пример класса, который работает со стандартным массивом фиксированного размера:

```cpp
class Array {
private:
    static const int SIZE = 10; // Фиксированный размер массива
    int array[SIZE];

public:
    // Конструктор, принимающий массив
    Array(const int arr[SIZE]) {
        for (int i = 0; i < SIZE; ++i) {
            array[i] = arr[i];
        }
    }
    
    // Интерфейс класса (например, вывод массива)
    void print() {
        for (int i = 0; i < SIZE; ++i) {
            std::cout << array[i] << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    int myArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    Array arr(myArray);
    arr.print();

    return 0;
}
```

Если же размер массива не известен заранее, можно использовать `std::vector`:

```cpp
#include <iostream>
#include <vector>

class Array {
private:
    std::vector<int> array;

public:
    // Конструктор, принимающий вектор
    Array(const std::vector<int>& arr) : array(arr) {
        // Инициализация вектора при помощи списка инициализации
    }
    
    // Интерфейс класса (например, вывод массива)
    void print() const {
        for (int num : array) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    Array arr(vec);
    arr.print();

    return 0;
}
```

Если вы действительно хотите использовать сырые массивы и передавать их в конструктор, вам нужно знать их размер заранее или передать размер как аргумент конструктора:

```cpp
#include <iostream>

class Array {
private:
    int* array;
    size_t size;

public:
    // Конструктор, принимающий указатель на массив и его размер
    Array(const int* arr, size_t sz) : size(sz), array(new int[sz]) {
        for (size_t i = 0; i < size; ++i) {
            array[i] = arr[i];
        }
    }
    
    // Деструктор для освобождения памяти
    ~Array() {
        delete[] array;
    }

    // Копирующий и перемещающий конструкторы и операторы присваивания
    // должны быть реализованы для корректной работы с памятью

    // Интерфейс класса (например, вывод массива)
    void print() const {
        for (size_t i = 0; i < size; ++i) {
            std::cout << array[i] << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    int myArray[] = {1, 2, 3, 4, 5};
    size_t size = sizeof(myArray) / sizeof(myArray[0]);

    Array arr(myArray, size);
    arr.print();

    return 0;
}
```

При работе с сырыми массивами важно помнить о необходимости управления памятью и реализации конструктора
Ну вы бы хоть ошибку-то саму привели. Уважайте отвечающих. 

Вот так работает:

Ну не может компилятор по Array<int, 3> arr { 90,90 }; догадаться, что {90, 90} - это числа в массиве, адресс которого надо передать.

Кстати, у вас тут ошибка: Array вы создали на 3 элемента и копируете 3 элемента, а данных задали только 2.
Похожие вопросы