2013-04-12 6 views
0

Пожалуйста, обратите внимание на следующий код (код стоит тысячи слов):C++ Pimpl и абстрактный класс вместе

shape.hpp

class Shape { 
public: 
    double area() const; 
private: 
    class ShapeImpl; 
    ShapeImpl* pimpl; 
}; 

shape.cc

// ABS 
class Shape::ShapeImpl { 
public: 
    double area() const = 0; 
}; 


class Circle : public Shape::ShapeImpl { // error: Shape::ShapeImpl is private 
public: 
    double area() const {return pi*r*r;} 
}; 


double Shape::area() const { 
    return pimpl->area(); 
} 

Я знаю, откуда исходит ошибка, но я касаются передовой практики. Мои вопросы:

  1. В случае вышеуказанного кода смешивается Pimpl с ABC плохая идея?

  2. Если нет, то какой способ избежать ошибки (сохранение инкапсуляции и т. Д.)?

  3. если да, то что мне нужно сделать, чтобы получить полиморфизм, скрывая реализацию от пользователя (в моем сценарии Shape)?

Обс: Предположим, что производительность не является проблемой.

спасибо.

ответ

1
  1. Его прекрасная идея. Для справки, здесь идиома письма/конверта, из-за Coplien. [Вместо этого вы можете использовать enum; очевидно, необходимо обрабатывать ошибки и т. д. Параллельно, что базовый тип является общедоступным, а реализация скрыта. Смотри ниже.

  2. Я бы просто сделал начальную декларацию ShapeImpl; какие проблемы это вызывает?

См: example with a Shape

+0

Очень поучительный пример, спасибо. Я бы тоже сделал публикацию ShapeImpl, но, поскольку я новичок в идиоме Pimpl, я не был уверен в том, чтобы изменить то, что я видел в примерах. Может быть, я слишком беспокоюсь о лучших практиках ... – montefuscolo

 Смежные вопросы

  • Нет связанных вопросов^_^