Реализовать абстрактный класс как локальный класс? плюсы и минусы - PullRequest
5 голосов
/ 17 марта 2010

по какой-то причине я думаю о реализации интерфейса внутри некоторой функции (метода) как локального класса.

Рассмотрим следующее:

class A{
public:

    virtual void MethodToOverride() = 0;

};

A * GetPtrToAImplementation(){

    class B : public A {
    public:
        B(){}
        ~B(){}

        void MethodToOverride() {
            //do something
        }
    };

    return static_cast<A *>(new B());
}


int _tmain(int argc, _TCHAR* argv[])
{

    A * aInst = GetPtrToAImplementation();

    aInst->MethodToOverride();

    delete aInst;
    return 0;
}

причины, по которым я это делаю:

  1. Мне лениво реализовывать класс (B) в отдельных файлах
  2. MethodToOverride просто делегирует вызов другому классу
  3. Класс B не должен быть виден другим пользователям
  4. Не нужно беспокоиться об удалении aInst, так как умные указатели используются в реальной реализации

Итак, мой вопрос: правильно ли я это делаю?

Заранее спасибо!

1 Ответ

5 голосов
/ 17 марта 2010
  1. Вы можете определить B в безымянном пространстве имен файла реализации, в котором вы реализуете GetPtrToAImplementation().

  2. A должен иметь виртуальный дтор.

  3. Согласно текущему стандарту C ++, вы не можете использовать локальные классы в качестве аргументов шаблона. (Это означает, что вы не можете использовать их с STL, например.)

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