2011-01-11 2 views
4

Можно создать дубликат:
Declaring a function that return a 2D array in a header file?не удается преобразовать из полукокса (*) [10], чтобы символ ** в ответ

Я пытаюсь иметь простую функцию геттер для 2D массива , и я не могу представить правильный синтаксис для его отправки.

В настоящее время у меня есть следующие:

class Sample 
{ 
public: 
    char **get2D(); 

private: 
    static const int x = 8; 
    static const int y = 10; 
    char two_d[x][y]; 
}; 


char** Sample::get2D() 
{ 
    return two_d; 
}; 

ответ

6

Массив массивов отличается от массива указателей на массивов. В вашем случае вы не можете вернуть правильный тип без ширины вашего массива (y), который будет опубликован в вашем публичном интерфейсе. Без этого компилятор не знает, насколько широка каждая строка возвращаемого массива.

Вы можете попробовать следующее:

class Sample 
{ 
public: 
    static const int x = 8; 
    static const int y = 10; 
    typedef char Row[y]; 
    Row *get2D(); 

private: 
    char two_d[x][y]; 
}; 
0

Гораздо лучше было бы сделать это:

const char& operator()(int x1, int y1) 
{ 
    // Better to throw an out-of-bounds exception, but this is illustrative. 
    assert (x1 < x); 
    assert (y1 < y); 
    return two_d[x][y]; 
}; 

Это позволяет вам безопасный доступ только для чтения ваших внутренних массивов (проверяемый!).

+0

И даже лучше было бы использовать библиотеку Boost Matrix! http://www.boost.org/doc/libs/1_36_0/libs/numeric/ublas/doc/matrix.htm – EmeryBerger

+0

+1, хотя я не согласен, что лучше исключить исключение. Вы должны сделать то и другое. Утверждение, затем исключение. Исключения трудно отследить до точки бросания. Утверждения, как правило, запускают некоторую версию, определенную точкой прерывания, для ввода с помощью отладчика. –

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