Автоматизируйте pimpl'ing классов C++ — там простой способ?

. Сеть уже идет System.ComponentModel.BackgroundWorker класс конкретно для справлений с работающими фоновыми задачами и связывающийся с GUI. Используйте его.

11
задан Joseph Garvin 25 October 2009 в 17:18
поделиться

3 ответа

Нет, нет простого ответа. :-( Я думаю, что почти каждый эксперт по объектно-ориентированным объектам говорит «предпочитают композицию наследованию», будет языковая поддержка, которая сделает композицию намного проще, чем наследование.

6
ответ дан 3 December 2019 в 10:44
поделиться

Я не говорю, что это хорошо (просто то, что пришло в голову).
Но вы можете поэкспериментировать с перегрузкой оператора ->

#include <memory>
#include <iostream>

class X
{
    public:
    void plop()
    {
        std::cout << "Plop\n";
    }
};

class PimplX
{
    public:
        PimplX()
        {
            pimpl.reset(new X);
        }
        X* operator->()
        {
            return pimpl.get();
        }
    private:
        PimplX(PimplX const&);
        PimplX& operator=(PimplX const&);
        std::auto_ptr<X>    pimpl;
};   


int main()
{    
    PimplX      x;

    x->plop();
}
2
ответ дан 3 December 2019 в 10:44
поделиться

Один из вариантов - использовать вместо этого интерфейсный класс:

class ClassA {
  virtual void foo() = 0;
  static ClassA *create();
};

// in ClassA.cpp

class ImplA : public ClassA {
/* ... */
};
ClassA *ClassA::create() {
  return new ImplA();
}

Однако это увеличивает накладные расходы на выборку указателей функций vtable.

Кроме этого, я не могу придумать ничего подобного орудие труда. Как вы сказали, синтаксический анализ C ++ - нетривиальная задача, и существуют другие языки, где это менее проблематично (например, C # или Java связывают все с задержкой, так что вы можете позже без проблем изменить их расположение в памяти).

0
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: