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

от admin

Передача массива через конструктор класса с использованием шаблонов C ++

Я хотел бы модернизировать небольшую математическую библиотеку, используя новые парадигмы C ++ (у меня есть компилятор C ++ 17). В частности, мне нужно передать массив в класс через конструктор.

Это «классический» старый способ, которым я пользовался. Оно работает

Итак, я попытался изменить класс Vector с помощью того, что я понял о шаблонах с переменными параметрами и пакете параметров. Не работает

Ошибка, возвращаемая компилятором

ошибка: невозможно преобразовать long long * в long double при инициализации

Что я делаю неправильно? Кроме того, мне интересно, возможно ли использовать std :: array вместо raw array как внутри основного метода, так и в классе Vector.

3 ответа

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

Вы можете определить свой собственный вектор и при этом использовать преимущества std :: vector для создания ваших векторных объектов. Например с наследованием:

В случае композиции вам нужно определить нужные вам конструкторы.

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

Как вы видите с std :: vector, вы получаете все преимущества, необходимые для создания вашего собственного объекта Vector.

Передача такого массива не является решением. Шаблоны Variadic используются для передачи N номеров параметров в класс / функцию. И все же вы передаете только один параметр!

Я бы посоветовал вам

Я предлагаю вам использовать ссылки на массивы, которые доступны во всех версиях C ++:

Кстати, если вы можете, используйте вектор. Я очень сомневаюсь, что этот пользовательский векторный класс так же эффективен, как std::vector (без геометрического роста или оптимизированного копирования и перемещения)

Согласно вашему определению

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

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

Обратите внимание, что такой вид использования не является хорошей практикой, обычно вы должны использовать std контейнеры и избегать использования new .

How do I pass an array to a constructor?

I want to pass an array to a constructor, but only the first value is passed—the rest looks like garbage.

Here’s a simplified version of what I’m working on:

Can someone explain why this doesn’t work and how to properly pass an array? Also, I don’t want to copy the array. (And do I really have to indent every line by 4 spaces for code? That’s pretty tedious.)

6 Answers 6

In this case it might be best to use a reference to the array:

A couple of advantages — no copying of the array, and the compiler will enforce that the correct size array is passed in.

The drawbacks are that the array you initialize the board object with needs to live at least as long as the object and any changes made to the array outside of the object are ‘reflected’ into the object’s state. but those drawbacks occur if you use a pointer to the original array as well (basically, only copying the array will eliminate those drawbacks).

One additional drawback is that you can’t create the object using a pointer to an array element (which is what array function parameters ‘decay’ to if the array size isn’t provided in the parameter’s declaration). For example, if the array is passed through a function parameter that’s really a pointer, and you want that function to be able to create a board object referring to that array.

Массивы объектов

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

Однако при отсутствии конструктора без параметров это объявление приведет к ошибке. В этом случае необходимо явно передать значения конструктору при объявлении массива объектов.

Если конструктор принимает только один параметр, то при создании массива объектов можно передать список значений через запятую внутри фигурных скобок. Если перед объявлением конструктора стоит ключевое слово explicit , то этот способ использовать уже нельзя. Пример создания массива объектов и указания списка инициализации показан в листинге 13.17.

Листинг 13.17. Инициализация массива объектов

Если конструктор содержит несколько параметров или перед объявлением конструктора с одним параметром, указано ключевое слово explicit , то необходимо применять полную форму инициализации (листинг 13.18).

Читать:
Как удалить фрагмент текста

Листинг 13.18. Полная форма инициализации массива объектов


Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

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

Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.2.2009

Репутация: нет
Всего: нет

вот код класса, в конструктор которого передается массив

Код
class Calculations
<
private double MySum = 0;
//массивы искомых параметров
//*———————————-*//
private double[] myArray=new double[1763];//массив элементов выборки

private double[] arrayOfExpectations=new double[5];//массив параметров математического ожидания
private double[] arrayOfDispersions=new double[5];//массив параметров дисперсии
private double[] arrayOfParams=new double[5];//массив весов
//*———————————-*//

public Calculations(double[] MyData)
<
MyData = new double[1763];
//myArray = new double[1763];

for (int i = 1; i < MyData.Length; i++)
<
MySum += MyData[i];
this.myArray[i] = MyData[i];
>
>
public double ReturnResults()
<
return (MySum);
>

private double sum(double[] arrayOfExpectations, double[] arrayOfDispersions, double[] arrayOfParams,double xj)
<
double s = 0;

for (int i = 1; i < arrayOfExpectations.Length; i++)
<
s += ((arrayOfParams[i] / arrayOfDispersions[i]) * Math.Exp(-0.5 * ((xj — arrayOfExpectations[i]) / arrayOfDispersions[i]) * ((xj — arrayOfExpectations[i]) / arrayOfDispersions[i])));
>
return s;
>
public double gijm(int j,double xj)
<
double result = 0;

result = (arrayOfParams[j] / arrayOfDispersions[j]) * Math.Exp(-0.5 * ((xj — arrayOfExpectations[j]) / (arrayOfDispersions[j])) * ((xj — arrayOfExpectations[j]) / (arrayOfDispersions[j])));
result = result / sum(arrayOfExpectations,arrayOfDispersions,arrayOfParams,xj);

return result;
>
//получение оценок для весов в сумме
public void updateArrayOfParams(double eps)
<
double[] distance = new double[5];
double totaldistance = 0;

while (totaldistance < eps)
<
for (int i = 0; i < 5; i++)
<
double sum = 0;
double oldParams = 0;

oldParams = arrayOfParams[i];
for (int j = 0; j < myArray.Length; j++)
<
sum += gijm(i, myArray[j]);
>
sum += sum / myArray.Length;
arrayOfParams[i] = sum;

distance[i]=(arrayOfParams[i]-oldParams)*(arrayOfParams[i]-oldParams);
totaldistance += distance[i];
>
totaldistance = Math.Sqrt(totaldistance);
>
>
//вычисление следующей оценки математического ожидания
public void updateArrayOfExpectations(double eps)
<
double[] distance = new double[5];
double totaldistance = 0;

while (totaldistance < eps)
<
for (int i = 0; i < 5; i++)
<
double sum1 = 0;
double sum2 = 0;
double oldExpectation = 0;

oldExpectation = arrayOfExpectations[i];
for (int j = 0; j < myArray.Length; j++)
<
sum1 += gijm(i, myArray[j]);
>
for (int j = 0; j < myArray.Length; j++)
<
sum2 += gijm(i, myArray[j]) * myArray[j];
>
arrayOfExpectations[i] = sum2 / sum1;
distance[i]=(arrayOfExpectations[i]-oldExpectation)*(arrayOfExpectations[i]-oldExpectation);
totaldistance += distance[i];
>
totaldistance = Math.Sqrt(totaldistance);
>
>
//обновление массива дисперсий в смысле евклидовой нормы
public void updateArrayOfDispersions(double eps)
<
double[] distance = new double[5];
double totaldistance = 0;

while (totaldistance < eps)
<
for (int i = 0; i < 5; i++)
<
double sum1 = 0;
double sum2 = 0;
double oldDispersion = 0;

дальше идет вызов методов

Код
returnArrayOfDispersions()
Код
returnArrayOfExpectations()
Код
returnArrayOfParams()
Код
private double[] arrayOfExpectations
private double[] arrayOfDispersions
private double[] arrayOfParams

1ый вопрос: как грамотно передать массив

Код
MyData
Код
private void button1_Click_1(object sender, EventArgs e)
<
Calculations calculations=new Calculations(MyArray[1763])
calculations.runAlgorithm(0.001);
calculations.returnArrayOfParams;
>
Код
calculations.runAlgorithm(0.001);
calculations.returnArrayOfParams;

Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36

double[] data = new double[] < . >;
Calculations calc = new Calculations(data);

внутри конструктора достаточно сохранить переданную ссылку

.
private double[] _data1;

public Calculations(double[] data1, . )
<
this._data1 = data1;
>

Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.2.2009

Репутация: нет
Всего: нет

спасибо за ответ!

проблема возникла с индексацией массивов. при отладке программы выскакивает следующая ошибка:

Цитата
"Индекс находился вне границ массива."

помогите пожалуйста найти причину ошибки.вот ссылка на мой проект
проект

Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: нет
Всего: 4

проблема возникла с индексацией массивов. при отладке программы выскакивает следующая ошибка:

Цитата
"Индекс находился вне границ массива."
Код
for (int i = 1; i < MyData.Length; i++)
<
MySum += MyData[i];
this.myArray[i] = MyData[i];
>

Код
for (int i = 1; i < arrayOfExpectations.Length; i++)
<
s += ((arrayOfParams[i] / arrayOfDispersions[i]) * Math.Exp(-0.5 * ((xj — arrayOfExpectations[i]) / arrayOfDispersions[i]) * ((xj — arrayOfExpectations[i]) / arrayOfDispersions[i])));
>

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

2. "Индекс находился вне границ массива."

Код
for (int i = 0; i <= 5; i++)
<
Console.Write("Оценка для параметра p", i, "=", arrayOfParams[i]);
>

и в функциях returnArrayOfExpectations() , returnArrayOfDispersions() в таких же циклах аналогично,
длина массива 5, индексация с 0, последний элемент 4-й , никак не 5-й.

  • Что же такое .NET? Краткое описание,изучаем.
  • Какой язык программирования выбрать? выбираем.
  • C#. С чего начать? начинаем.
  • Защита исходного кода .NET приложений, защищаем.
  • Литература по .NET, обращаемся.
  • FAQ раздела,ищем здесь.
  • Архиполезные ссылки:www.connectionstrings.com, www.pinvoke.net, www.codeproject.com

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »

[ Время генерации скрипта: 0.1190 ] [ Использовано запросов: 21 ] [ GZIP включён ]

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