Ошибки, баги, вопросы - страница 2664

Askr:
Или скаяал скопировал в терминал и все само работает?

Да.

[Удален]
Alexey Kozitsyn:
Невозможно закоммитить в сторадж...

Снова та же проблема! Разработчики, почините, пожалуйста, сторадж! С ним невозможно работать. Common error.

Sergey Dzyublik:

Все ок, обращайтесь еще:

Обращаемся. Вот такой код работает:

class A
{
  protected:
    int field;

  public:
    A() { field = rand(); }
};

class B: public A
{
  public:
    B(A &origin)
    {
      field = origin.field;// это другой экземпляр, C++ дает ошибку 'int A::field' is protected
    }
    int getField(void) const
    {
      return field;
    }
};


void OnStart()
{
    A a;
    B b(a);
    Print(b.getField());
}

Но по правилам C++ не должен еще на стадии компиляции разрешать доступ к protected (полю field другого объекта, пусть и того же класса; protected обозначает доступ только к унаследованным полям того же объекта, а для доступа к чужим поле должно быть public). Это баг или фича?

Stanislav Korotky:

Обращаемся. Вот такой код работает:

Но по правилам C++ не должен еще на стадии компиляции разрешать доступ к protected. Это баг или фича?

В смысле не должен? В каком именно месте? Так-то у вас и наследование публичное (т.е. протектед члены  в наследниках становятся публичными) и метод публичный.

з.ы. протёр глаза, увидел где, пардон)
Stanislav Korotky:

Обращаемся. Вот такой код работает:
Но по правилам C++ не должен еще на стадии компиляции разрешать доступ к protected. Это баг или фича?

Да, С++ оnline ругается: https://onlinegdb.com/Hkv1_13EU
Это к разработчикам.

Sergey Dzyublik:

Да, С++ оnline ругается: https://onlinegdb.com/Hkv1_13EU
Это к разработчикам.

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

Stanislav Korotky:

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

class A
{
  protected:
    int field;

  public:
    A() { field = rand(); }
    A(const A &origin)
    {
      field = origin.field;
    }
};

class B: public A
{
  public:
    B(const A &origin):A(origin){}
    int getField(void) const
    {
      return field;
    }
};


void OnStart()
{
    A a;
    B b(a);
    Print(b.getField());
}
Sergey Dzyublik:

Гы ;-) Этот способ не "катит", потому что требует изменения базового класса, который в чужой библиотеке. Если уж её патчить, то много в чем - я про эти "пути" и говорил, но это не оптимально с точки зрения поддержки и распространения.

Stanislav Korotky:

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

Боюсь, это порушит и мои проекты.

Stanislav Korotky:

Гы ;-) Этот способ не "катит", потому что требует изменения базового класса, который в чужой библиотеке. Если уж её патчить, то много в чем - я про эти "пути" и говорил, но это не оптимально с точки зрения поддержки и распространения.

Хм, если в библиотеке не предусмотрели публичный сеттер и геттер для этого поля, значит это кому нибудь нужно? )) Надо типа фасад для библиотеки варганить видимо.