Как правильно это сделать? Вызов функции, которая находится внутри указателя на указатель на указатель? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть 3D указатель. Я указал на указатель на «символьный» объект. Этот объект, как член своего класса, имеет указатель на другой тип объекта. Давайте назовем этот тип объекта "die". Этот тип объекта имеет функцию, которую я хотел бы использовать.

Я настроил ее так, как мне кажется, но я получаю ошибки. Я думаю, что мог бы понять, что это говорит мне, но не уверен, есть ли легкий обходной путь к этому. Если так, я бы с удовольствием это сделал. Был бы очень признателен за помощь.

Я пытался сделать его 3D-указателем, но я не получил другого результата.

int main()
{
    srand (time(0));

    int setter = 1;
    character ***charPtr = new barbarian**(setter); 

    charPtr->ptrAttackDieOne->roll();

    cout << "The roll is" << charPtr->ptrAttackDieOne->getRoll() << endl;

    return 0;
}

main.cpp: 25:14: ошибка: запрос на член 'ptrAttackDieOne' в '*> charPtr', который имеет тип не символьного типа 'символ **' charPtr-> ptrAttackDieOne-> roll ();^

main.cpp: 27: 39: ошибка: запрос на член 'ptrAttackDieOne' в '*> charPtr', который имеет неклассный тип 'символ **' cout << "Бросок"<< charPtr-> ptrAttackDieOne-> getRoll () <<> endl;

1 Ответ

2 голосов
/ 08 ноября 2019

Чтобы разыменовать тройной указатель, вы должны сначала сослаться на него дважды:

(**charPtr)->ptrAttackDieOne->roll();

Я также хочу отметить, что этот компилятор не будет:

character ***charPtr = new barbarian**(setter); 

Он пытаетсясоздать переменную типа barbarian** и присвоить ей целое число setter, что недопустимо. Если вы хотите создать 3D-указатель, каждый уровень должен указывать на реальную, выделенную память. new не может заполнить несколько уровней косвенности:

    Barbarian*** barbarianFamiliesGroupedBySurname = new Barbarian**[3];
    for (int i=0; i<3; i++) {
        barbarianFamiliesGroupedBySurname[i] = new Barbarian*[2];
        for (int j=0; j<2; j++) {
            barbarianFamiliesGroupedBySurname[i][j] = new Barbarian("bob", weapon::axe);
        }
    }

...