2011-02-03 3 views
0

Мой вопрос - как получить доступ и изменить 2D-массив, определенный в одном классе, который дружит с другим классом. Ниже приведены некоторые подробности по моему вопросу:Доступ к двумерному массиву между двумя классами друзей

В class A Я объявляю и выделяю подходящее пространство для своего 2D-массива (указатель на указатель) u.

Class A 
{ 
    public: 
    friend class B; 
    long double **u; 
    int fun; 
    void make(); 
}; 
void A::make() 
{ 
    long double **u = new long double *[nx]; 
    for (int i=0;i<nx;i++) 
    u[i] = new long double [ny]; 
    int fun = 9; 
} 

Class A дружит с Class B; Мне нужно использовать массив, объявленный в Class A, в функции, определенной в class B. Ниже мой класс B:

class B 
{ 
    public: 
    void get(A*); 
}; 

void B::get(A *pt) 
{ 
    using namespace std; 
    cout << pt->fun; 
    cout << pt->u[0][0]; 
} 

я получаю ошибку шины на моей второй соиЬ pt->u[0][0]. Есть ли простой способ использовать эту настройку, я должен получить доступ к своему массиву u [] []? Я думаю, что получаю ошибку, потому что указатель указывает на первую запись моего массива, поэтому весь мой 2D-массив сохраняется в памяти как одна строка (вслух здесь). Я парень Фортрана, поэтому этот материал для меня немного новый.

Любая помощь или «указатели» на другие полезные темы были бы оценены.

Спасибо!

Альберто

+1

ли вы назвать 'сделать()' первый ... ? –

+1

И поскольку u является общедоступным, тот факт, что класс B является другом A, действительно не играет роли в проблеме (исправьте меня, если я ошибаюсь). – AlexJF

+0

Да, у меня есть функция, которая вызывает make() и get(). Я получаю правильное значение «cout << pt-> fun», когда компилирую и запускаю код. – Al007

ответ

4

Я думаю, вы получите сообщение об ошибке, потому что A::u не инициализирован (в методе A::make инициализации локальной переменной u, не является членом. Вы должны изменить

void A::make() 
{ 
    long double **u = new long double *[nx]; // should be just u, or this->u. 
+0

Спасибо! это сделало трюк – Al007

0

Есть некоторые проблемы с вашим кодом: кажется, не должны быть определены в любом месте nx и ny, и в make вы не инициализировать A::fun на всех, вы вместо того, чтобы установить локальную переменную с именем fun который немедленно выходит из сферы действия.

Что касается вашей ошибки, это звучит как ошибка проистекает из того факта, что make() не была вызвана на pt. Убедитесь, что make() вызывается на экземпляр, который вы передаете get, иначе массив u не будет выделен.

+0

Я пропустил некоторые подробности, например nx и ny. Я вызываю make() в моей int main()часть моего кода. Здесь я передаю адрес моего класса функции get() (я думаю, правильно), так как я могу скомпилировать и получить правильное значение «fun» для отображения на моем экране. – Al007

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