Действительно ли внутренние классы могут получить доступ к частным переменным?

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

let data = [1, 2, 3]
let data2 = [4, 5, 6]

let filteredData: [Int] = data
    .map { [110] }
    .append(contentsOf: data2.map { [110] })

Решение состоит в том, чтобы использовать конкатенацию вместо append:

let data = [1, 2, 3]
let data2 = [4, 5, 6]

let filteredData: [Int] = data
    .map { [111] }
    + data2.map { [111] }

Для объяснения это похоже на :

let a: Int = 0
let b = a += 1 // this is append
let c = (a + 1) += 1 // this is append with a temporary expression

(вы добавляете что-то, что немедленно отбрасывается, а значение не сохраняется в c).

, что, очевидно, следует сделать как

let a: Int = 0
let b = a + 1

. Обратите внимание, что даже если бы вы могли append использовать временное возвращаемое значение, append не имеет возвращаемого значения, а ваш результат, назначенный filteredDataOpt, быть Void.

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

108
задан Community 16 May 2017 в 19:38
поделиться

3 ответа

Внутренний класс является другом класса, в котором он определяется.
Так, да; объект типа Outer::Inner может получить доступ к членской переменной var из объекта типа Outer.

В отличие от Java хотя, нет никакой корреляции между объектом типа Outer::Inner и объектом родительского класса. Необходимо сделать отношения отцов и детей вручную.

#include <string>
#include <iostream>

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::string a = "myconst1";
                std::cout << parent.var << std::endl;

                if (a == MYCONST)
                {   std::cout << "string same" << std::endl;
                }
                else
                {   std::cout << "string not same" << std::endl;
                }
            }
        private:
            Outer&  parent;
    };

    public:
        Outer()
            :i(*this)
            ,var(4)
        {}
        Outer(Outer& other)
            :i(other)
            ,var(22)
        {}
        void func()
        {
            i.func();
        }
    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main()
{

    Outer           o1;
    Outer           o2(o1);
    o1.func();
    o2.func();
}
112
ответ дан SimplyKnownAsG 24 November 2019 в 03:33
поделиться

Внутренний класс имеет доступ ко всем членам внешнего класса, но он не имеет неявной ссылки на экземпляр родительского класса (в отличие от некоторой странности с Java). Таким образом, при передаче ссылки на внешний класс к внутреннему классу он может сослаться на что-либо во внешнем экземпляре класса.

28
ответ дан MSN 24 November 2019 в 03:33
поделиться

Что-либо, что является часть Внешних, должно иметь доступ ко всем участникам Outer, общедоступным или частным.

Редактирование: Ваш компилятор корректен, var не является членом Внутренних. Но если у Вас есть ссылка или указатель на экземпляр Внешних, он мог бы получить доступ к этому.

6
ответ дан Mark Ransom 24 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: