2012-05-11 5 views
1

У меня есть класс, похожий на этот:C++ - 2D массив в качестве аргумента метода

class Krzyzowka 
{ 
    protected: 
    char model[40][40]; 
    int x, y; 

    public: 
     Krzyzowka() { } 

      Krzyzowka(char model[][40], int x, int y) 
      { 
       this->model=model; 
      } 
}; 

Теперь я объявляю в главном():

char array[10][10]; 

и хочу, чтобы передать его в :

Krzyzowka(char model[][40], int x, int y) 

Я делаю это так:

Krzyzowka obj(array, 10, 10); 

Но я хочу, чтобы установить модель 2D массив с переданного массива:

this->model=model; 

Но компилятор возвращает две ошибки:

error: no matching function for call to ‘Krzyzowka::Krzyzowka(char [10][10], int, int)’ 

error: incompatible types in assignment of ‘char (*)[40]’ to ‘char [40][40]’ 

Как я могу сделать это правильно? Заранее спасибо за помощь.

+0

Скажите что? Правильно передать массив [10] [10] в качестве массива [40] [40]? –

+0

'Krzyzowka' - это кроссворд, так почему бы не использовать' std :: vector '? –

ответ

0

Нет операции, которая автоматически присваивает массив другому массиву.

Возможные обходные пути, которые приходят на ум:


вручную скопировать назначают данные на свой внутренний массив с помощью цикла (убедитесь, что следить за эффективную nrows и ncols). Для обхода жалоб компилятора вы можете использовать шаблон (предполагая, что размер известно во время компиляции):

template<int NROWS, int NCOLS> 
    Krzyzowka(char (&model)[NROWS][NCOLS]) 
    { 
     nrows = NROWS > nrows ? nrows : NROWS; 
     ncols = NCOLS > ncols ? ncols : NCOLS; 
     for (int row = 0; row < nrows; row++) 
      for (int col = 0; col < ncols; col++) 
      this->model[row][col] = model[row][col]; 
    } 

Теперь вы можете создать объект, как:

char array[][2] = {{'a', 'b'}, {'c', 'd'}}; 
Krzyzowka k(array); 

Если размеры массив известен только во время выполнения (например, на основе пользовательского ввода, а char** array динамически распределяется вложенным new[]), вам может потребоваться принять подход given here или перейти к следующему.


Еще лучше было бы, вероятно, будет использовать некоторый стандартный тип массива, как std::vector (который вы можете поменять или назначить). Тогда у вас также нет проблем с жалобами на несовместимость типа компилятора.

std::vector<std::vector<char> > array(nrows, std::vector<char>(ncols)); 
std::vector<std::vector<char> > model; 
model = array; // or model.swap(array); if you don't need the copy 
+0

Я действительно хотел бы использовать массив символов для модели. Если я использую: char array [nrows] [ncols]; колесо ** модель; модель = массив; Какой должен быть прототип моего конструктора? –

2

Параметр char model[][40] может быть использован только для массива, как parameter[x][40].

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

class Krzyzowka 
{ 
    protected: 
     char **pp_model; 
     int x, y; 

    public: 
     Krzyzowka() { } 

     Krzyzowka(char **pp_model, int x, int y) 
     { 
      this->pp_model = pp_model; 

      // do not miss follow two line 
      this->x = x; 
      this->y = y; 
     } 
}; 

Затем вы можете передать char ** параметр для создания экземпляра объекта вместо использования char array[x][y].

И теперь, когда вы используете c++. Лучше не использовать массив строк. это evil. Вместо этого вы можете использовать stl vector.

Может это быть полезным для вас :)

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