2013-12-06 3 views
1

У меня есть структура, определенная в файле с именем 'xxx.h':2D-массив структур с новым ключевым словом в C++!

struct struct_name 
{ 
    declarations; 
}; 

Я включил этот заголовок - 'xxx.h' - в другом файле C++, yyy.cpp

И тогда я попробуйте создать 2D-массив указанной структуры с использованием нового ключевого слова следующим образом (я узнал, как создать 2D-массив структур по этой ссылке: Declaring a 2D array of type struct in c++).

struct struct_name * some_name; 
some_name = new struct struct_name[x][y]; 

Когда я компилирую, я получаю следующее сообщение об ошибке: error: ‘y’ cannot appear in a constant-expression. Эта ошибка, в частности, указывает на второе измерение массива.

Также Когда я попытался инициализировать это 2D массив структур с некоторого значения, как:

some_name[i][j].var_name = value; 

я получаю следующее сообщение об ошибке:

error: no match for ‘operator[]’ in ‘*(some_name + ((sizetype)(((unsigned int)i) * 12u)))[j]’ 

Пожалуйста, сообщите мне, как это исправить.

Спасибо.

ответ

3

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

Причина вы ошибка происходит потому, что C++ требует знания типов при объявлении массива, выделяющих массив и т.д. Когда вы сделаете это:

some_name = new struct_name[x][y]; 

, что вы говорите компилятор «Я хочу выделить x объектов типа struct_name[y]». Но struct_name[y] - это не тип, известный во время компиляции. Размер неизвестно, но должно быть известно (при этом погрешность около constexpr ожидания Это будет работать:..

struct_name (*some_name)[WIDTH] = new struct_name[x][WIDTH]; 

будет работать, если WIDTH это время компиляции известно постоянной Но для вас, это не константа так требуется другое решение.


Altnerative подход

альтернативой быстро исправить подход представлен ниже

#include <vector> 

int main() 
{ 
    int rows, cols; 

    // get row and column count. 

    typedef std::vector<struct_name> MatrixRow; 
    typedef std::vector<MatrixRow> Matrix; 
    Matrix some_name(rows, MatrixRow(cols)); 

    // use some_name[i][j] however you need 

    return 0; 
} 

Есть и другие способы сделать это, но это, скорее всего, самый быстрый способ получить вас. Кроме того, он продвигает правильные концепции RAII.Если вам нужна более специализированная цель 2D-матрицы, вам, возможно, придется разработать свой собственный класс, поскольку стандартная библиотека C++ не имеет прямой концепции двумерного динамического массива изначально, поэтому мы изобретаем ее с помощью вектора векторных типов.

+0

Спасибо @WhozCraig. Я попробую это и дам вам знать. – arun

+0

Большое спасибо WhozCraig. Ваш альтернативный подход работал :-) Я использовал альтернативный подход, потому что WIDTH вводится только во время выполнения. – arun

+1

@ Casey спасибо за исправление. очень ценю коррекцию. Был на моем пути! ходить по магазинам и немного спешить. еще раз спасибо. – WhozCraig

0

Попробуйте заявление в yyy.cpp как:

struct struct_name **some_name; 

Причина этого заключается в том, что some_name[i] должны быть типа struct_name * для того, чтобы получить доступ к другому уровню переменных.

+0

Примечание: динамический массив указателей на динамические массивы НЕ совпадает с подлинным 2D-массивом. Оба типа и макет памяти заметно отличаются друг от друга, и, несмотря ни на что, OP будет иметь набор инструментов, достаточный для того, чтобы он не считал их равными, потому что это не так. Вне синтаксиса сахара они совершенно разные звери. – WhozCraig

+0

@Tower: Спасибо, ваше предложение помогло мне избавиться от ошибки: «нет соответствия для оператора ...» Однако ошибка «y не может появляться в постоянном выражении» все еще встречается – arun

0

Вам действительно нужны C++-массивы?

Почему бы не использовать std::vector<std::vector<struct_name>>?

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

std::array<std::array<struct_name, 2>, 3> где 2 и 3 являются размерами 2D-массива.

Смежные вопросы