Возникла проблема при инициализации динамического массива
Проблема возникает в строках:
int n;
int* arr = new int[n];
Изза того что n не равна конкретному числу. Как исправить? Вроде нарушений доступа и синтаксиса нет. И почему данная проблема возникла?
Вот весь код:
class Base
{
virtual void Norma() = 0;
};
class Vector: public Base
{
private:
int n;
int* arr = new int[n];
public:
Vector(){}
~Vector(){}
void InputVector()
{
cout << "Input n:";
cin >> n;
for (int i = 0; i < n; i++)
{
//arr[i] = rand() % 10;
cin >> arr[i];
}
}
void Norma()
{
int max=arr[0];
for (int i = 0; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
cout <<"Vector Norma is: "<<fabs(max);
}
void OutVector()
{
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
}
};
int main()
{
Vector vec;
vec.InputVector();
vec.Norma();
vec.OutVector();
system("pause");
return 0;
}
Достаточно часто мне на SO попадается код вроде этого:
int n;
int* arr = new int[n];
Почему-то новичкам кажется, что new int[n] магическим образом связывает n с размером массива, так что потом, меняя n, можно растягивать и сжимать массив. Это не так. После вызова new int[n] размер массива остается фиксированным.
Так что нужно сначала получить n, а только потом делать new.
Решение: int* arr = new int[n]; заменить на просто int *arr;, а после cin >> n; поставить arr = new int[n];.
Кроме того, обратите внимание: Из вашего класса как из решета течет память! В деструкторе не хватает delete [], а также недостает копирующего конструктора и оператора присваивания.
Советую почитать: правило трех (the rule of three).
А чему равно Ваше n при создании объекта, не пробовали вывести? Уверен там какой-то мусор. Логичнее задавать это число в конструкторе или инициализировать его после создания экземпляра класса. Вы же выделяете память под неопределённое число элементов, и только потом это число задаёте.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости