Под капотом ссылка эквивалентна константному указателю на некоторую переменную (компилятор просто дает вам синтаксический сахар того, как работать с такими указателями, чтобы они всегда инициализировались).Таким образом, вы не хотите иметь одну и ту же переменную и два разных указателя на нее, один из которых будет ссылаться на true
, а другой на false
.Это, очевидно, невозможно.OOP-способ сделать это - передать не ссылку на логическое значение, а некоторый интерфейс к вашим классам и использовать реализацию, использующую ту же самую логическую переменную:
class IIsOpenProvider
{
public:
virtual ~IIsOpenProvider() = 0;
virtual bool GetOpenValue() = 0;
};
class IIsClosedProvider
{
public:
virtual ~IIsClosedProvider() = 0;
virtual bool GetClosedValue() = 0;
};
class ValueProvider : public IIsOpenProvider, public IIsClosedProvider
{
public:
bool GetOpenValue() override { return isOpen; }
bool GetClosedValue() override { return !isOpen; }
private:
bool isOpen;
};
class A {
IIsOpenProvider& isOpen;
A(IIsOpenProvider& value): isOpen(value) {}
void f() {
if (isOpen.GetOpenValue()) {
doSomething();
}
}
};
class B {
IIsClosedProvider& isClosed;
B(IIsClosedProvider& value): isClosed(value) {}
void g() {
if (IIsClosedProvider.GetClosedValue()) {
doSomething();
}
}
};
// usage
ValueProvider val;
A a(val);
B b(val);