2010-11-19 2 views
1

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

Каков стандартный способ решения этого вопроса?

+0

Возможно, функция геттера, возвращающая указатель на объект B? – cdhowie

+0

B должен быть выставлен, но могут ли операции над ним быть сконструированы с постоянной степенью защиты? – robert

+0

Нет, в этом случае это не const. Он должен быть изменчивым. – hd112

ответ

0

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

1

Позвольте B реализовать интерфейс IB. A управляет экземпляром B внутри и имеет getter 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

перегрузить оператор -> в А и в реализация возвращает переменную указателя типа B. Но, как вы знаете, вы не сможете получить доступ к членам А через указатель А и ->. Также у него есть риск вызвать замешательство, кто когда-либо читал код. Я имел в виду нечто подобное.

struct A 
{ 
    B *p; 
    B * operator ->() 
    { 
    return p; 
    } 
};