Как выставить интерфейс объектов-членов в C ++ - PullRequest
1 голос
/ 19 ноября 2010

C ++: у меня есть базовый объект (объект A), который содержит объект-член (объект B). Интерфейс объекта-члена (объект B) должен быть полностью открыт через указатель на объект A. Каков наилучший способ сделать это? Я мог бы разместить объект в качестве публичного члена, но это похоже на хак. Я мог бы написать обертки для всех интерфейсов B в A, но это выглядит ужасно. Я мог бы объединить объекты, но я делаю сериализацию классов в XML, так что наличие отдельных классов будет чище. Я думал о классификации друзей, но не думаю, что это относится к этой ситуации.

Каким стандартным способом решить этот тип проблемы?

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

Пусть B реализует интерфейс IB.A внутренне управляет экземпляром B и имеет получатель getB, который возвращает интерфейс IB частного экземпляра B.Если вы хотите защитить экземпляр B, вы можете создать методы IB const, а также скрыть деструктор (сделав его закрытым в IB).

class IB {
private:
    ~IB();
public:
    virtual void method1() = 0;
    virtual void method2() = 0;
};

class B : public IB {
public:
    virtual void method1() {};
    virtual void method2() {};

    void destruct() { delete this; }
};

class A {
private:
    B myB;
public:
    IB *getB() { return &myB; }
};

(Этопросто чтобы дать представление. Прошло более 3 лет с тех пор, как я в последний раз касался C ++. Я мог сделать несколько вопиющих ошибок.)

0 голосов
/ 20 ноября 2010

Перегрузите оператор -> в A и в реализации верните указатель переменной типа B. Но, как вы знаете, вы не сможете получить доступ к членам A через указатель A и ->.Также есть риск вызвать путаницу у тех, кто когда-либо читает код.Я имел в виду что-то вроде этого.

struct A
{
  B *p;
  B * operator -> ()
  {
    return p;
  }
};
0 голосов
/ 19 ноября 2010

Я отвергаю идею, что делать это вообще хорошая идея, но я бы сделал это публичным членом.Если вам это не нравится, вы можете использовать метод getB ().Если возможно, я бы заставил его возвращать константную ссылку вместо обычной ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...