Доступ к атрибутам подкласса через указатель на массив указателей - PullRequest
0 голосов
/ 23 февраля 2020

Допустим, я хочу реализовать мешок с червями. У меня есть class Worm, у которого есть int ID атрибута. У меня также есть класс Bag:

class Bag{

    // pointer to a 1D array of pointers to all the worms
    Worm** population;

    // constructor
    Bag(){
        // initiate 1D population of the worms
        int N = 100;
        Worm** population = new Worm*[N];
        for (int i=0; i<N; i++){
            Worm new_worm(i);
            population[i] = &new_worm;
        }
    }
}

, поскольку N известно во время компиляции. Я не уверен, должен ли массив выделяться динамически?

Моя проблема в том, что позже в коде я хотел бы выполнить:

Bag bag();
int ID = bag.population[10]->ID;

, и код компилируется, но когда я выполняю, я получаю Segmentation fault: 11. Я проверил (комментируя), что проблема вызвана точной строкой извлечения идентификатора.
Как мне получить доступ к полям и вызывать методы класса Worm в сумке?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

замените червя ** популяция = новый червь * [N] с этим-> популяцией или чем-то подобным.

вы выделяете локальную переменную "популяция" вместо члена "популяция" -> сумка. население все еще нулевое

2 голосов
/ 02 марта 2020

На самом деле, я считаю, что реальная проблема в том, что вы инициализируете массив population адресом (ами) локальной переменной new_worm. Я полагаю, что не определено, будут ли адреса, присвоенные массиву, даже различаться или нет (инициализация l oop может свободно использовать то же место в локальном стеке для переменной new_worm.

Хотя есть и другие способы решения этой проблемы, можно заменить две строки:

        Worm new_worm(i);
        population[i] = &new_worm;

на:

        population[i] = new Worm(i);
...