Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40

Ошибка при создании массива объектов

15.08.2017, 20:11. Показов 1784. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, необходимо создать массив случайного количества объектов, при выполнении такого кода компилятор выдает ошибку:

Line 6 - expression did not evaluate to a constant
Line 8 - expression did not evaluate to a constant

Не мог бы кто-нибудь объяснить почему ошибка и как ее исправить?

Сам код:
C++
1
2
3
4
5
6
7
8
9
#include <time.h>
#include "someClass.h"
 
int main()
{
    const int numbers = rand() % 10 + 1;
 
    someClass classNo[numbers];
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.08.2017, 20:11
Ответы с готовыми решениями:

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

Ошибка в создании массива объектов
Есть класс Circle, в котором определены переменные для координат Х и У и радиуса окружности (здесь всё правильно, вроде бы). При компиляции...

Call of nonfunction при создании массива объектов класса
Здравствуйте, мне нужен массив объектов класса Contact. На последней строке в cpp выдает ошибку E2314 call of nonfunction вот сам...

12
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518
15.08.2017, 20:34
Лучший ответ Сообщение было отмечено stre_l0k как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
class someClass{};
 
int main()
{
    const int numbers = rand() % 10 + 1;
    someClass* classNo = new someClass[numbers];
    delete[] classNo;
    std::cin.get();
    return 0;
}
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
15.08.2017, 21:41
Цитата Сообщение от stre_l0k Посмотреть сообщение
Не мог бы кто-нибудь объяснить почему ошибка
Размер массива должен задаваться константным выражением:
https://msdn.microsoft.com/ru-... b821x.aspx
Размер массива(error C2057: требуется константное выражение)
1
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
15.08.2017, 22:15  [ТС]
А как тогда удалить, из получившегося массива объектов classNo, некие объекты, которые не удовлетворяют заданным критериям?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
15.08.2017, 23:23
Цитата Сообщение от stre_l0k Посмотреть сообщение
тогда
Тогда - это когда?
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
15.08.2017, 23:45
Цитата Сообщение от stre_l0k Посмотреть сообщение
А как тогда удалить, из получившегося массива объектов classNo, некие объекты,
Никак, из массивов нельзя ничего удалять
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
15.08.2017, 23:59  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Тогда - это когда?
При создании класса случайным образом генерируются его параметры и сравниваются с условием, это происходит несколько раз, если через несколько попыток параметры все еще не подходят, то мне этот класс уже не нужен.
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
16.08.2017, 00:02
Цитата Сообщение от stre_l0k Посмотреть сообщение
При создании класса случайным образом генерируются его параметры и сравниваются с условием
Это как? Псевдокодом можеш показать?
0
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
16.08.2017, 00:24  [ТС]
Цитата Сообщение от notAll Посмотреть сообщение
Это как? Псевдокодом можеш показать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
 
class someClass
{
public:
    bool attemptCreate();
 
    int getParameter() { return mParameter; }
    void setParameter(int parameter) { mParameter = parameter; }
 
    int getAttempt() { return mAttempt; }
    void setAttempt(int attempt) { mAttempt = attempt; }
 
    int getMaxAttempt() { return mMaxAttempt; }
    int getMaxParameter() { return mMaxParameter; }
 
private:
    int mParameter; // Параметр
    int mMaxParameter = 10; // Его макс. значение
    int mAttempt = 0; // Количество попыток
    int mMaxAttempt = 5;
};
 
bool someClass::attemptCreate()
{
    bool isSuccess = false;
    int parameter = rand() % 10;
    int maxParameter = getMaxParameter();
    
    if (parameter > maxParameter)
        return isSuccess;
 
    setParameter(parameter);
    isSuccess = true;
    return isSuccess;
}
 
int main()
{
    const int numbers = rand() % 10 + 1;
    someClass* classNo = new someClass[numbers];
 
    for (int i = 0; i < numbers; i++)
    {
        int attempt = classNo[i].getAttempt();
        int maxAttempt = classNo[i].getMaxAttempt();
 
        for (int a = attempt; a < maxAttempt; a++)
        {
            bool isSuccess = classNo[i].attemptCreate();
            if(isSuccess == true)
                // Тогда этот класс подходит
                // если условие за все циклы не выполняется, то данный класс меня не устраивает
        }
    }
 
    delete[] classNo;
 
    char response;
    std::cin >> response;
    return 0;
}
В моем задание я прямоугольник заполняю случайным количеством других прямоугольников случайных размеров, которые не должны соприкасаться, поэтому увеличение количества попыток не вариант, т.к. в моем случае не всегда можно будет создать прямоугольник
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
16.08.2017, 00:27
http://www.cplusplus.com/reference/stl/
1
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
16.08.2017, 00:41
Да, переписать можна как то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    const int numbers = rand() % 10 + 1;
    std::vector<someClass> classNo(numbers);
    
    classNo.erase(std::remove_if(classNo.begin(), classNo.end(), [](someClass& sc)
    {
        int attempt = sc.getAttempt();
        int maxAttempt = sc.getMaxAttempt();
 
        for (int a = attempt; a < maxAttempt; ++a)
        {
            if (sc.attemptCreate())
                return true;
        }
        return false;
    }), classNo.end());
}
1
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 40
16.08.2017, 00:46  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
http://www.cplusplus.com/reference/stl/
Т.е. я создаю контейнер:
C++
1
vector<someClass> vec;
а затем если условие выполняется, то добавляю в него:
C++
1
vec.push_back(classNo[i]);
Я правильно понимаю?

Добавлено через 4 минуты
Цитата Сообщение от notAll Посмотреть сообщение
classNo.erase(std::remove_if(classNo.beg in(), classNo.end(), [](someClass& sc) ...
Не объясните эту строчку?
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
16.08.2017, 01:03
Лучший ответ Сообщение было отмечено stre_l0k как решение

Решение

Цитата Сообщение от stre_l0k Посмотреть сообщение
Не объясните эту строчку?
Это удаление элементов из контейнера (от итератора, который возвратит remove_if и до конца контейнера, так как remove_if сам по себе ничего не удаляет - он только группирует не удаляемые элементы вместе и возвращает итератор на первый не подходящий елемент)

Добавлено через 2 минуты
Цитата Сообщение от stre_l0k Посмотреть сообщение
а затем если условие выполняется, то добавляю в него
Для этого есть алгоритм std::copy_if

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
std::vector<someClass> filtered_vec;
    std::copy_if(classNo.begin(), classNo.end(), std::back_inserter(filtered_vec), [](someClass& sc)
    {
        int attempt = sc.getAttempt();
        int maxAttempt = sc.getMaxAttempt();
 
        for (int a = attempt; a < maxAttempt; ++a)
        {
            if (sc.attemptCreate())
                return true;
        }
        return false;
    });
Добавлено через 4 минуты
Ну и самому пушить тоже можно:
C++
1
2
3
4
5
for (int i = 0; i < classNo.size(); ++i)
    {
        if (classNo[i].attemptCreate())
            filtered_vec.push_back(classNo[i]);
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2017, 01:03
Помогаю со студенческими работами здесь

Ошибка при создании массива
задача такая, методом перебора найти первое простое десятизначное значение дробной части е (эпсилон). для простоты решил не вычислять...

Ошибка при создании массива
Не пойму в чем ошибка... Подскажите пожалуйста. void CreatMas(int *m) { int st,stlb; scanf(&quot;%d&quot;,&amp;st); ...

Ошибка при создании нового массива
Задача: Дан одномерный массив чисел, среди элементов которого есть одинаковые. Создать новый массив из различных элементов исходного...

Ошибка при создании динамического массива.
Все доброго времени. Начал создавать одномерный массив, потом решил его преобразовать в динамический одномерный. Понимаю что...

Ошибка при создании двумерного массива
Моя цель: создать матрицу (ее размерность должна вводится через cmd) и заполнить ее случайными числами (используя rand) в промежутке . ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru