объявление массива C++ в заголовке

Как правило, запрос должен быть отправлен с одним из трех типов контента: raw, json и text.

Попробуйте отправить запрос с: content-type: "application / json; charset = utf-8"

10
задан 26 November 2008 в 20:46
поделиться

7 ответов

Нет это не возможно. Объявления массива в заголовках должны иметь постоянное размерное значение. Иначе для конструкций как "sizeof" невозможно функционировать правильно. Необходимо будет объявить массив как тип указателя и использовать новый [] в конструкторе. Пример.

class Test { 
    int *a;
public:
    Test(int size) {
       a = new int[size];
    }
    ~Test() { delete [] a; }
private:
    Test(const Test& other);
    Test& operator=(const Test& other);
};
13
ответ дан 3 December 2019 в 13:56
поделиться

Как другие ответы указали, размер массива фиксируется во время компиляции. Однако при помощи шаблонов можно параметризовать размер во время компиляции:

template <int N> class Test {
    int a[N];
public:
    Test() { }
};

Test<5> test;
Test<40> biggertest;

Эта техника не позволяет Вам вычислить размер во время выполнения (как динамическое std::vector решение делает), но в зависимости от Ваших потребностей это может быть достаточно.

4
ответ дан 3 December 2019 в 13:56
поделиться

Короткий Ответ: Нет (Размер массива определяется во время компиляции только),
Длинный ответ:

Можно использовать вектор для достижения того же результата:

class Test
{
    std::vector<int> a;
    public:
        Test(std::size_t size):
            a(size)
        {}
};
17
ответ дан 3 December 2019 в 13:56
поделиться

В первую очередь, обычно лучше инициализировать вещи в списке инициализации конструктора, не в теле конструктора.

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

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

3
ответ дан 3 December 2019 в 13:56
поделиться

Посмотрите решение Martin (использование std::vector), и помните это, даже если необходимо передать буфер API C std::vector позволяет Вам сделать это путем передачи &vec[0] :

std::vector<char> vec(10);
memset(&vec[0], 0, vec.size());

Это, как гарантируют, будет работать, но только если вектор не пуст (причуды C++, <вздох>).

2
ответ дан 3 December 2019 в 13:56
поделиться

Нет, это не возможно. Необходимо использовать динамический массив такой в качестве std::vector. C99 позволяет структуре иметь неразмерный массив как последнего участника только, но даже когда Вы делаете это, все еще необходимо вручную выделить память сами, например, с malloc().

0
ответ дан 3 December 2019 в 13:56
поделиться

То, о чем Вы говорите, не возможно. Классы всегда имеют постоянный размер. У Вас могло быть свое использование класса указатель на динамично выделенный массив, или Вы могли использовать станд.:: вектор.

0
ответ дан 3 December 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: