На данный момент нет стандартного способа синхронизации конфигураций поставщика услуг между различными средами. Сообщается, что эта проблема отслеживает требование к функции и ее текущую работу в настоящий момент, и вы можете ожидать ее в будущей версии.
Одно из возможных решений, которое вы можете использовать для достижения вашей целью является получение поставщика услуг из службы администратора и создание того же поставщика услуг в другой среде.
Вы можете использовать конфигурацию поставщика услуг на основе файлов для достижения этой цели. Но при таком подходе вы не сможете увидеть поставщиков услуг, добавленных из файлов конфигурации в консоли управления. Следующее ограничение, с которым вы столкнетесь, заключается в том, что вы можете добавлять собственные конфигурации проверки подлинности на основе saml только через конфигурационные файлы (например, конфигурации входящей аутентификации OAuth 2.0 / OIDC)
Чтобы ответить на ваш последний вопрос, вы не можете синхронизировать [IS-HOME]/repository
для этого. Причина, по которой вы могли наблюдать это поведение, похоже, заключается в том, что вы используете встроенную базу данных H2 и ее папку [IS-HOME]/repository/database
. С вашей синхронизацией файлов вы фактически синхронизировали базы данных.
Проблема в том, что ссылка должна быть инициализирована, как указано в сообщении об ошибке. Для этого в конструкторе мы используем список инициализаторов .
Race::Race(Car& c, Track t) : m_Car(c), m_Track(t)
{
m_Car.Show();
}
Редактировать: m_Track здесь не нужно инициализировать, но рекомендуется всегда использовать список инициализаторов, если это возможно, и это также более эффективно.
Обратите внимание, что в 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;
после объявления члена внутри учебный класс. Этот инициализатор по умолчанию будет использоваться, когда конструктор не указывает инициализатор для этого члена и в неявно определенном конструкторе по умолчанию, если таковой имеется. Это может быть удобно, если вы хотите, чтобы несколько конструкторов использовали один и тот же инициализатор.]