Доступ к членам внешнего класса без сохранения указателя - PullRequest
0 голосов
/ 08 июня 2018

ПРОБЛЕМА:

Я хочу настроить систему элементов, сохраняя при этом пар этих элементов, которые я хочу Доступ и изменить легко (добавить больше) .

В то же время я хочу свести сложность к минимуму и не реализовывать все в одном классе.

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

class A {
    class B_pair {
        int idx_of_B[2];

    public:
        B get_B_value_1(); // how to access B's?
        B get_B_value_2();
        // a lot more member functions
    };

public:
    std::vector<B>  B_values;
    std::vector<B_pair>  special_B_pairs;
    // a lot more stuff
};

Однако у меня есть проблема в том, что я не могу получить доступ к значениям B из класса B_pair.

НЕУДАЧНОЕ РЕШЕНИЕ 1

class A {
    A() { B_pair::outer = this; }
    class B_pair {
        static A *outer;
        void init_outer(A *o);
    };
}

Я использовал элемент static, потому что у меня много B_pair объектов и дополнительной памятиуказатель / ссылка в каждом значимом .

Это прекрасно работает.Однако, если у меня одновременно несколько объектов A, это проблематично, так как указатель outer в конечном итоге указывает на последний созданный объект A.

FAILED SOLUTION 2

Другой подход, который я выбрал, - хранение указателей .

class A {
    class B_pair {
        B *items[2];
    };
    std::list<B>  B_values; // I need random access iterators!!
};

Однако это означает, что мне нужно использовать больше неэффективных структур данных, чем std::vector,который делает недействительными свои итераторы при расширении.

ВОПРОС

Как я могу получить доступ к элементам внешнего class A из внутреннего class B, или что-то подобноесделать эту работу?В идеале мне бы хотелось что-то похожее на первое решение, но с одним экземпляром A *outer для каждого A объекта.

Обратите внимание, что ЭТО ВОЗМОЖНО В JAVA !!

PS В данный момент я использую шаблон проектирования Singleton и сохранил статический указатель.Не большой поклонник этого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...