Как передать массив в класс

от admin

Как передать массив в класс в C++

Когда я создаю класс, я хотел бы иметь возможность хранить массив в этом классе. Это возможно?

Например. Если у меня есть класс с именем array для хранения массива из моей основной функции

@PoweRoy: если бы он это сделал, это не сработало бы. @EddieBall: использовать std::array — Mooing Duck

@MooingDuck: я надеялся, что он скажет что-то вроде «Я получаю эту ошибку» или что-то в этом роде 🙂 — RvdK

Вы даже пытались скомпилировать это, прежде чем отдать нам? — Wug

@EddieBall Это нормально, если ваш код не компилируется по причинам, которые вы объясняете в своем вопросе, но вы должны по крайней мере позаботиться об остальном. Есть много : и ; отсутствующий. — Gorpik

2 ответы

использовать std::array вместо необработанного массива. Это похоже на необработанный массив, но с возможностью копирования и имеет полезные функции-члены.

или может быть std::vector если вы хотите иметь возможность изменять размер по желанию

Я не знаю, что вы делаете, поэтому трудно дать дельный совет. Вы можете передать необработанный массив по ссылке, указателю и счетчику, паре итераторов.

Создание шаблонов с помощью std::array — хорошая идея. Предполагая, что размер не всегда равен 3, но он не будет изменен после его создания. — ECrownofFire

@ECrownofFire: Это сделало бы это довольно тонкой оболочкой, тогда как я предполагаю, что это всего лишь один член более сложного класса. Так что OP, вероятно, хочет фиксированный размер. Если ему нужно изменить его после создания, для этого и предназначен вектор. — Мычание утки

Да, но вы должны либо выделять массив динамически при создании класса, либо массив всегда должен быть одного размера.

Это, вероятно, то, что вам нужно, но обратите внимание, что вам почти наверняка понадобится собственный конструктор копирования и оператор присваивания, чтобы вы не разделяли память между несколькими экземплярами этого класса. Лучшим способом может быть создание функции копирования, которую могут использовать оба.

C#. Передача массивов в методы. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода

Передача массивов в методы по значению. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода

В данной теме демонстрируется передача по значению массивов разных типов и размерностей.

Содержание

  • 1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?
  • 2. Пример передачи массива целых ( ulong ) чисел в метод
  • 3. Пример передачи в метод массива чисел типа double
  • 4. Пример передачи одномерного массива структур в метод
  • 5. Пример передачи одномерного массива классов в метод
  • 6. Пример передачи одномерного массива перечислений в метод
  • 7. Пример передачи двумерного массива целых ( int ) чисел в метод
  • 8. Пример передачи двумерного массива классов в метод
  • 9. Пример возврата одномерного массива целых чисел ( int ) из метода
  • 10. Пример возврата двумерного массива типа double из метода
  • 11. Пример возврата двумерного массива классов из метода
  • 12. Пример передачи двумерного ступенчатого массива в метод

Поиск на других ресурсах:

1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?

Общая форма передачи одномерного массива в метод имеет следующий вид:

  • access – модификатор доступа ( public , protected , private );
  • return_type – тип, возвращаемый методом;
  • MethodName – название метода;
  • type – тип массива, который передается в метод;
  • parameterName – название массива, который есть формальным параметром метода MethodName .

2. Пример передачи массива целых ( ulong ) чисел в метод

В примере продемонстрирован метод ReverseArray , который реверсирует массив чисел типа ulong . Метод получает параметром массив items типа ulong .

Использование метода в другом программном коде может быть следующим:

3. Пример передачи в метод массива чисел типа double

Реализован метод, который получает массив чисел типа double в качестве параметра. Метод возвращает сумму элементов массива.

Использование метода в другом программном коде может быть следующим:

4. Пример передачи одномерного массива структур в метод

Задана структура Country , описывающая информацию о стране

Реализация метода MaxPopulation() , определяющего страну, с наибольшим населением. Метод получает массив структур Country .

Демонстрация вызова метода MaxPopulation() из другого программного кода

5. Пример передачи одномерного массива классов в метод

Задан класс Cylinder , реализующий цилиндр

Реализация метода GetMaxVolumeCylinder , получающего массив Cylinders . Метод возвращает порядковый номер элемента массива (цилиндра), который имеет наибольший объем

Использование метода GetMaxVolumeCylinder() в другом методе

6. Пример передачи одномерного массива перечислений в метод

Дана структура DayWeek , определяющая день недели

Ниже реализован метод GetDayOff() , который получает массив типа DayWeek в качестве параметра. Метод определяет количество выходных дней (суббота, воскресенье) в массиве DayWeek .

Демонстрация использования метода GetDayOff() из другого программного кода может быть следующей:

7. Пример передачи двумерного массива целых ( int ) чисел в метод

В примере демонстрируется передача двумерного массива методу Sum() . В качестве параметров метод Sum() получает:

  • двумерный массив целых чисел с именем mn ;
  • количество строк m в массиве;
  • количество столбцов n в массиве.

Метод находит сумму элементов двумерного массива.

Чтобы корректно обращаться к элементам массива, в метод нужно передать количество строк m и столбцов n . Использование метода Sum() в другом программном коде

8. Пример передачи двумерного массива классов в метод

Пусть задан класс, который реализует цвет и прозрачность пиксела на экране. Объявление класса имеет следующий вид

Демонстрируется объявление метода SetArrayColor() , устанавливающего цвет и прозрачность в двумерном массиве классов типа ColorPixel .

Использование метода в другом программном коде может быть следующим

9. Пример возврата одномерного массива целых чисел ( int ) из метода

Демонстрируется метод, который возвращает массив целых чисел ( int[] ). Метод заполняет элементы массива значениями, которые есть квадратами позиций (индексов) массива. Метод получает входным параметром размер массива n .

Вызов метода из другого программного кода может быть следующим

Читать:
Что такое o большое

10. Пример возврата двумерного массива типа double из метода

Демонстрируется возврат двумерного массива из метода. Метод GetDoubleArray() получает входным параметром размер массива m*n . Метод возвращает массив.

Использование метода GetDoubleArray() в другом программном коде

11. Пример возврата двумерного массива классов из метода

Пусть задан класс, который реализует символ типа char . В классе есть внутренняя переменная, конструктор и методы, которые определяют принадлежность символа к некоторой категории символов.

Реализация метода GetArrayChar() , который генерирует (возвращает) двумерный массив объектов типа Char

Демонстрация вызова метода GetArrayChar() из другого программного кода

12. Пример передачи двумерного ступенчатого массива в метод

В примере демонстрируется передача в метод и возврат из метода двумерного ступенчатого массива целочисленных величин.

Метод CopyIntArray() получает входными параметрами количество строк m в ступенчатом массиве A и сам ступенчатый массив A . Метод возвращает ступенчатый массив B , который есть копией массива A . Ступенчатый массив B размещается в другой области памяти

Демонстрация использования метода CopyIntArray() для копирования массивов следующая

В результате выполнения вышеприведенного кода, на экран будет выведен следующий результат

Передача массива объектов в класс

Этот код дает ошибку
«grade.c ++ в функции-члене» void Grad :: searcharray (Name *) ‘:
grade.c ++: 11:25: ошибка: запрос на имя участника в
array ‘, который имеет тип указателя’ Name * ‘(может быть, вы хотели использовать’ -> ‘?) «Мне нужна помощь, чтобы сделать эту работу. Я предполагаю, что это нечто простое, например, расширение класса, как в Java, но не уверен, как это работает в C ++.
Я предполагаю, что вы можете передать массив объектов классу, как в C, используя только массив.
Корень моего вопроса в том, чтобы найти решение и найти причину неправильного кода.

Решение

Ваш код может быть существенно улучшен, если использовать преимущества стандартной библиотеки. Проблема с вашим исходным кодом заключалась в том, что вы делали array->name где array был массив в стиле C (технически указатель на который он распался). Такое выражение невозможно, если вы сначала не получите указатель на индекс:

Более того, цикл for, в котором была написана эта строка, слишком часто пересекает массив 1. Условное утверждение i <= 10 должно быть i < 10 так что вы не будете разыменовывать адрес после конца массива.

В любом случае, вместо того, чтобы показывать ваш код с исправлениями, я подумал, что мог бы показать вам, как он должен выглядеть, если вы используете векторы, управление памятью и std::string , Надеюсь, это поможет:

Обратите внимание, что я также сделал searcharray static так как это не имеет ничего общего с данным экземпляром Grade ,

Другие решения

Как уже отмечали другие, проблема в том, что вы используете параметр, объявленный Name *array[] лайк array->name ,

Помните, что C ++ построен поверх C, который следует правилу «объявления, имитирующего использование», что означает, что способ объявления переменной выглядит так, как он используется. Итак, с декларацией:

То, как вы получаете имя из этого:

А также name является членом Name так что вы должны получить Name объект первым. Затем вы можете прикрепить к членству доступ:

И тогда вы можете использовать -> ярлык где (*x).y такой же как x.y :

На ваш код, похоже, сильно влияет стиль кода, требуемый для версии C. 1989 или 1990 г. Вы должны стараться избегать этого, поскольку это делает написание кода C ++ намного хуже, чем должно быть.

Вы объявляете Grade * и выделить его немедленно. Вы можете объединить объявление с инициализацией в:

Но вам не нужно использовать указатель в любом случае: использовать Grade test; (и если вам нужен указатель, то вы должны использовать умный указатель. Никогда не используйте «голый» new .)

Точно так же вы можете избежать new когда вы создаете имена.

Вам следует избегать массив фиксированного размера здесь. Вместо этого вы должны по умолчанию использовать std::vector :

Вы должны объявить переменную i как часть цикла for, а не как переменная вне него:

Когда вы читаете ввод, вы должны избегать scanf и буферы фиксированного размера. Вместо этого, если вы читаете строки, вы, вероятно, должны начать с std::getline а также std::string ,

Как передать массив конструктору?

Я хочу передать массив конструктору, но передается только первое значение — остальное выглядит как мусор.

Вот упрощенная версия того, над чем я работаю:

Может кто-нибудь объяснить, почему это не работает и как правильно передать массив? Кроме того, я не хочу копировать массив. (И действительно ли мне нужно отступать каждую строку на 4 пробела для кода? Это довольно утомительно.)

6 ответов

В этом случае лучше всего использовать ссылку на массив:

Несколько преимуществ — без копирования массива, и компилятор будет обеспечивать, чтобы был принят правильный массив размера.

Недостатки в том, что массив, который вы инициализируете объект board , должен жить как минимум до тех пор, пока объект и любые изменения, внесенные в массив вне объекта, «отражены» в состоянии объекта. но эти недостатки возникают, если вы используете указатель на исходный массив (в основном, только копирование массива устраняет эти недостатки).

Еще один недостаток заключается в том, что вы не можете создать объект с помощью указателя на элемент массива (который является тем, что параметры функции массива «распадаются», если размер массива не указан в объявлении параметра). Например, если массив передается через параметр функции, который действительно является указателем, и вы хотите, чтобы эта функция могла создать объект board , относящийся к этому массиву.

Попытка передать массив функции приводит к передаче указателя на первый элемент массива.

Вы не можете назначать массивы, а параметр типа T[] совпадает с T* . Так

Разыменовывает указатели на state и arr и присваивает первый элемент arr первому элементу state .

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

Альтернативно, вы должны посмотреть std::array<int> , который ведет себя точно так же, как вы предполагали, что массивы ведут себя:

Похожие статьи