Вы не можете (в общем) передать произвольный многомерный массив функции в C или C ++, как это было бы в Java (я упоминаю Java, потому что именно в этом заключается история ваших вопросов).
В текущем стандарте нет никакого способа поддержать что-либо вроде инициализаторов массива для вашего класса, хотя есть некоторые планы изменить это в следующей версии, C ++ 0x.
Если вы хотите, чтобы это имело гибкостьскажем, массивов Java (где клиенты могут изменять размер указанного массива, у вас есть несколько вариантов. Первый и лучший вариант - использовать std::vector<>
, который реализует динамический массив для вас, но вы можетеограничено этим вашей встроенной платформой. Вы также можете реализовать вещи самостоятельно как одномерный массив и принять динамический блок памяти. Пример:
class Foo
{
int *theArray_;
unsigned int rows_;
unsigned int cols_;
public:
Foo(int *theArray, int rows, int cols)
: theArray_(theArray)
, rows_(rows)
, cols_(cols)
{ }
void UseTheArray()
{
//Access array[5][6]
theArray[5*cols+6];
}
};
Обратите внимание, что в этом случае вызываемый абонент отвечает за передачупамяти. Также рассмотрите возможность использования std::auto_ptr
выше вместо необработанного указателя, чтобы было понятно, ктоотвечает за уничтожение блока памяти при уничтожении объекта.
Также обратите внимание, что вы не должны использовать имя _x
- к именам, начинающимся с подчеркивания, прикреплен целый набор правил, о которых вы, вероятно,хочу не думать.
РЕДАКТИРОВАТЬ: Это часть моего первоначального ответа;это неправильно:
Многомерный массив в C ++ - это всего лишь один блок памяти.Подобный многомерный массив можно принять только в одном случае - когда вы заранее знаете точные размеры массива в классе.Затем вы можете написать что-то вроде:
class Foo {
int coeff[3][6];
public:
Foo(int _x[3][6]) : coeff(_x) {}
};
Обратите внимание, что размер массива фиксирован и не может быть изменен клиентами вашего класса.