Разрешить доступ только членам объекта, а не самому объекту - PullRequest
2 голосов
/ 15 июня 2019

Дан следующий класс:

class Foo
{
public:

    //...

private:

    Bar mBar;
};

Можно ли предоставить элемент mBar таким образом, чтобы к нему могли получить доступ его члены, но не сам объект mBar?

Причина в том, что пользователи должны иметь доступ ко всем членам mBar, но они не должны иметь возможность назначать другой экземпляр Bar для mBar. Bar имеет много членов, и было бы сложно написать геттеры / сеттеры и переадресовать функции для них всех. Но если mBar обнародован, можно сделать aFoo.mBar = Bar(/*...*/);, и это единственное, что нельзя допустить. Удаление операторов присваивания Bar не вариант.

Ответы [ 2 ]

4 голосов
/ 15 июня 2019

, если вы хотите защитить только от ошибок, а не Макиавелли, operator-> может помочь (вы, возможно, захотите обертку вместо того, чтобы напрямую помещать ее в foo):

class Foo
{
public:
    //...
    const Bar* operator ->() const { return &mBar; }
    Bar* operator ->() { return &mBar; }
private:
    Bar mBar;
};

так

Foo foo;

foo->bar_member;
foo.foo_member;

// Machiavelli
*foo.operator->() = Bar();
1 голос
/ 15 июня 2019

Я бы, возможно, переосмыслил ваш дизайн, но здесь возможен косвенный способ с использованием промежуточного get метода:

struct Bar {
    int intAttr;
};

class Foo {
    Bar mBar;

public:

    template <class U>
    U& get(U Bar::* p) {
        return mBar.*p;
    }
};

Таким образом, вы можете получить доступ к любому публичному члену mBar, используя:

Foo foo;
foo.get(&Bar::intAttr);      // get
foo.get(&Bar::intAttr) = 0;  // set
...