Оболочка класса в C ++ - PullRequest
       3

Оболочка класса в C ++

1 голос
/ 05 декабря 2011

Скажем, у меня есть следующий абстрактный класс:

class AbstractClass {
  public:
    AbstractClass() {}
    virtual ~AbstractClass() {}
    virtual void virtMethod()
    {
       printf( "%p\n", this );
    }
    void method()
    {
      printf( "%p\n", this );
    }
    ...
};

И следующие дочерние классы:

class RawClass : public AbstractClass
{
  public:
    RawClass();
    ~RawClass();
    ...
};

class Wrapper : public AbstractClass
{
  public:
    Wrapper( AbstractClass* wrapee ) : _wrappee ( wrappee ) {}
    ~Wrapper() {};
    void virtMethod()
    {
      _wrappee->virtMethod();
    }
    ...

  private:
    AbstractClass _wrappee;
};

Теперь скажите, что я делаю следующее:

RawClass* r = new RawClass();
Wrapper* w = new Wrapper( r );
w->virtMethod(); // This prints the address of r
w->method(); // This prints the address of w

Я хотел бы, чтобы звонки на w->method() вели себя так же, как звонки на w->virtMethod(). Тем не менее, я не могу сделать это без виртуализации method() и написания его реализации в Wrapper, которая просто вызывает RawClass::method().

У меня явно есть некоторые проблемы с дизайном, но я не могу найти способ заставить это работать, хотя RawClass и Wrapper предписывают один и тот же интерфейс.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 05 декабря 2011

Я думаю, вам не следует извлекать Wrapper из AbstractClass и вместо этого перегружать -> оператор, такой как интеллектуальный указатель , чтобы можно было вызывать методы AbstractClass

class Wrapper 
{
    AbstractClass* _rawClass;
  public:
    Wrapper( AbstractClass* wrapee ) : _rawClass( wrapee ) {}

    AbstractClass& operator* ()
    {
        return *_rawClass;
    }

    AbstractClass* operator-> ()
    {    
        return _rawClass;
    }

};

и назовите это так

   RawClass* praw = new RawClass();
   Wrapper wrap(praw);
   wrap->virtMethod();

Boost или C ++ 11 уже делают это для вас, если вы используете shared_ptr

...