Может ли класс добавлять классы друзей во время выполнения на С++?

Я хотел бы, чтобы некоторые классы стали друзьями других классов во время выполнения. Есть ли способ сделать это?

В качестве альтернативы, есть ли способ получить доступ к общедоступным/защищенным/частным иварам объекта во время выполнения - или расширить класс, аналогичный функции категории Objective-C?

Вариант использования здесь заключается в том, что я хотел бы предоставить набору тестов доступ к ivars в классах во время выполнения, но не загрязняя код приложения кодом, специфичным для набора тестов. Платформа тестирования может измениться и будет отличаться в зависимости от платформы развертывания.

Резюме: найдите способ сохранить код приложения чистым и свободным от внешних артефактов фреймворка.


person user1824607    schedule 01.11.2018    source источник
comment
Что вы пытаетесь сделать, что потребовало бы от вас изменения дружбы во время выполнения? Концепция модификаторов доступа не существует во время выполнения.   -  person François Andrieux    schedule 02.11.2018
comment
Похоже на XY-проблему. Измените свой вопрос, чтобы описать вариант использования, и мы может предложить альтернативу, допустимую в C++.   -  person user4581301    schedule 02.11.2018
comment
user4581301 Я добавил вариант использования к исходному вопросу, спасибо за предложение.   -  person user1824607    schedule 02.11.2018
comment
stackoverflow.com/questions/11486622/   -  person drescherjm    schedule 02.11.2018
comment
@user1824607 user1824607 Время выполнения, похоже, здесь не играет роли. Или, по крайней мере, я не вижу, как. Вы пытаетесь загрузить динамическую библиотеку во время выполнения и хотите получить доступ к закрытым членам?   -  person François Andrieux    schedule 02.11.2018
comment
Это мнение, поэтому принимайте его с долей скептицизма. Я пришел из школы мысли, которая считает, что тесты не должны знать частные детали реализации. Если тест может делать то, что не может сделать программа, которая будет использовать тестируемый код, тест не проверяет истинные варианты использования, и результаты тестирования сомнительны.   -  person user4581301    schedule 02.11.2018
comment
есть ли способ получить доступ к публичным/защищенным/приватным переменным объекта во время выполнения... - Да. ObjC и C++ не похожи на .Net; среда выполнения не обеспечивает видимость. Так что просто измените заголовок другого класса на свой вкус. Также см. Как протестировать частную функцию или класс с закрытыми методами, полями или внутренними классами?, Тестирование члена частного класса в С++ без друга (и друзей).   -  person jww    schedule 03.11.2018


Ответы (1)


Я хотел бы, чтобы некоторые классы стали друзьями других классов во время выполнения. Есть ли способ сделать это?

Нет, это невозможно с С++.

В качестве альтернативы, есть ли способ получить доступ к общедоступным/защищенным/частным иварам объекта во время выполнения

Также нет концепции изменения видимости членов класса во время выполнения.

Модификаторы доступа — это чисто концепции времени компиляции, их невозможно изменить во время выполнения.


Способом преодоления этого для вашего конкретного варианта использования может быть использование интерфейсов, как я набросал здесь:

person πάντα ῥεῖ    schedule 01.11.2018