Полиморфизм переменных-членов

На данный момент нет стандартного способа синхронизации конфигураций поставщика услуг между различными средами. Сообщается, что эта проблема отслеживает требование к функции и ее текущую работу в настоящий момент, и вы можете ожидать ее в будущей версии.

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

Вы можете использовать конфигурацию поставщика услуг на основе файлов для достижения этой цели. Но при таком подходе вы не сможете увидеть поставщиков услуг, добавленных из файлов конфигурации в консоли управления. Следующее ограничение, с которым вы столкнетесь, заключается в том, что вы можете добавлять собственные конфигурации проверки подлинности на основе saml только через конфигурационные файлы (например, конфигурации входящей аутентификации OAuth 2.0 / OIDC)

Чтобы ответить на ваш последний вопрос, вы не можете синхронизировать [IS-HOME]/repository для этого. Причина, по которой вы могли наблюдать это поведение, похоже, заключается в том, что вы используете встроенную базу данных H2 и ее папку [IS-HOME]/repository/database. С вашей синхронизацией файлов вы фактически синхронизировали базы данных.

-1
задан Loïc 19 January 2019 в 12:35
поделиться

2 ответа

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

Race::Race(Car& c, Track t) : m_Car(c), m_Track(t)
{
    m_Car.Show();
}

Редактировать: m_Track здесь не нужно инициализировать, но рекомендуется всегда использовать список инициализаторов, если это возможно, и это также более эффективно.

0
ответ дан super 19 January 2019 в 12:35
поделиться

Обратите внимание, что в C ++ «инициализация» (создание объекта определенным образом, например, std::string str = "hi";) и «присваивание» (изменение значения существующего объекта, например, str = "hi";) - это две разные вещи. [1116 ]

Когда вы пишете конструктор, такой как

Car::Car(double s)
{
     m_Speed = s;
}

, C ++ нуждается в объекте, и все его члены существуют, и поэтому уже инициализированы, к тому времени, как вы достигнете первого {. Оператор m_Speed = s; является присваиванием, а не инициализацией. Поскольку вы не указали, как следует инициализировать m_Speed, C ++ вставляет логику, чтобы «инициализировать по умолчанию» его перед началом тела конструктора (хотя для базового типа, такого как double, это просто означает, что он имеет неопределенное значение до назначения ).

Обычно это не имеет значения для члена типа double. Но это может быть для члена типа класса, и это определенно подходит для члена ссылочного типа: ссылка ДОЛЖНА быть инициализирована, потому что ссылка всегда должна ссылаться на некоторый объект, а присвоение, левая часть которого всегда является ссылочной переменной, всегда назначает этому указанному объекту; нет способа изменить объект, на который ссылается ссылка.

Способ указать, как конструктор инициализирует элементы, использует список инициализаторов элементов:

Car::Car(double s)
    : m_Speed(s)
{}

Race::Race(const Car& c, Track t)
    : m_Car(c), m_Track(t)
{
    m_Car.Show();
}

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

[Примечание 1: показанный выше конструктор Race по-прежнему не совсем работает из-за другой проблемы: вы не можете инициализировать ссылку Car& из const Car&. Вам нужно будет либо изменить конструктор, чтобы он принимал параметр не const, либо изменить член на тип const Car&. Не-const параметр также позволит избежать потенциальных проблем с привязкой к временному.]

[Примечание 2: Другой способ указать инициализатор для членов класса - это поставить = something; после объявления члена внутри учебный класс. Этот инициализатор по умолчанию будет использоваться, когда конструктор не указывает инициализатор для этого члена и в неявно определенном конструкторе по умолчанию, если таковой имеется. Это может быть удобно, если вы хотите, чтобы несколько конструкторов использовали один и тот же инициализатор.]

0
ответ дан aschepler 19 January 2019 в 12:35
поделиться
Другие вопросы по тегам:

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