c ++ access protected member через auto [duplicate]

Для тех из вас, кто пытается сбросить греческий или другие «экзотические» языки, такие как я, но также имеют проблемы (ошибки в Unicode) со странными символами, такими как символ мира (\ u262E) или другие, которые часто содержатся в json формирует данные, такие как Twitter, решение может быть следующим: (sort_keys, очевидно, необязательно):

import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
     f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
123
задан hansmaad 17 February 2016 в 12:02
поделиться

4 ответа

Правила для auto по большей части такие же, как и для вывода типа шаблона. Приведенный пример работает по той же причине, когда вы можете передавать объекты частных типов в функции шаблона:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

И почему мы можем передавать объекты частных типов в функции шаблона, спросите вы? Потому что только имя типа недоступно. Сам тип все еще можно использовать, поэтому вы можете вообще вернуть его к клиентскому коду.

102
ответ дан Aconcagua 23 August 2018 в 02:08
поделиться
  • 1
    И чтобы убедиться, что конфиденциальность name не имеет ничего общего с типом , добавьте public: typedef Bar return_type_from_Baz; в класс Foo в вопросе. Теперь тип может быть идентифицирован публичным именем, несмотря на то, что он определен в частной части класса. – Steve Jessop 23 November 2012 в 18:36
  • 2
    Повторить пункт @ Steve: спецификатор доступа для name не имеет ничего общего с его type , как видно, добавив private: typedef Bar return_type_from_Baz; в Foo, как показано . Идентификаторы typedef 'd не обращаются к спецификаторам доступа, открытым и закрытым. – damienh 25 November 2012 в 02:54
  • 3
    Для меня это не имеет смысла. name этого типа является просто псевдонимом для фактического типа. Какое это имеет значение, если я назову его Bar или SomeDeducedType? Не похоже, что я могу использовать его, чтобы добраться до частных членов class Foo или чего-то еще. – einpoklum 2 December 2015 в 00:15

Контроль доступа применяется к именам. Сравните этот пример со стандартом:

class A {
  class B { };
public:
  typedef B BB;
};

void f() {
  A::BB x; // OK, typedef name A::BB is public
  A::B y; // access error, A::B is private
}
99
ответ дан chill 23 August 2018 в 02:08
поделиться

Чтобы добавить к другим (хорошим) ответам, вот пример из C ++ 98, который показывает, что проблема действительно не связана с auto вообще

class Foo {
  struct Bar { int i; };
public:
  Bar Baz() { return Bar(); }
  void Qaz(Bar) {}
};

int main() {
  Foo f;
  f.Qaz(f.Baz()); // Ok
  // Foo::Bar x = f.Baz();
  // f.Qaz(x);
  // Error: error: ‘struct Foo::Bar’ is private
}

Использование частный тип не запрещен, он только называет тип. Создание неназванного временного типа такого типа в порядке, например, во всех версиях C ++.

5
ответ дан Chris Beck 23 August 2018 в 02:08
поделиться

Этот вопрос уже очень хорошо ответил как на холод, так и на R. Martinho Fernandes.

Я просто не мог упустить эту возможность, чтобы ответить на вопрос с аналогией Гарри Поттера:

class Wizard
{
private:
    class LordVoldemort
    {
        void avada_kedavra()
        {
            // scary stuff
        }
    };
public:
    using HeWhoMustNotBeNamed = LordVoldemort;
};

int main()
{
    Wizard::HeWhoMustNotBeNamed tom; // OK
    Wizard::LordVoldemort not_allowed; // Not OK
    return 0;
}
8
ответ дан jpihl 23 August 2018 в 02:08
поделиться
Другие вопросы по тегам:

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