Подтвердить что ты не робот

Недостатки прямой декларации класса С++?

Я хочу использовать прямое объявление класса в своем программном обеспечении, поэтому я могу иметь typedefs
и использовать их внутри полной декларации класса.

Smth вот так:

class myclass;
typedef boost::shared_ptr<myclass> pmyclass;
typedef std::list<pmyclass > myclasslist;

class myclass : public baseclass
{
private:        // private member declarations
        __fastcall myclass();

public:         // public member declarations
        __fastcall myclass(myclass *Parent)
            : mEntry(new myclass2())
          {
            this->mParent = Parent;
          }
        const myclass *mParent;
        myclasslist mChildren;
        boost::scoped_ptr<myclass2> mEntry;
};

поэтому мой вопрос: есть ли недостатки в этом методе? Я вспоминаю дискуссию о проблемах деструктора с форвардной декларацией, но я не получил оттуда все. или есть ли другой способ реализовать что-то вроде этого?

Спасибо.

EDIT: Я нашел обсуждение, которое я имел в виду: здесь

4b9b3361

Ответ 1

Главный недостаток - это все. Форвардные декларации являются компромиссом для сохранения времени компиляции и позволяют иметь циклические зависимости между объектами. Тем не менее, стоимость заключается в том, что вы можете использовать этот тип только как ссылки и не можете ничего делать с этими ссылками. Это означает, что нет наследования, не передавая его как значение, не используя какой-либо вложенный тип или typedef в этом классе и т.д. Это все большие недостатки.

Конкретная проблема уничтожения, о которой вы говорите, заключается в том, что вы только пересылаете объявление типа и только удаляете его в модуле, поведение undefined и никакая ошибка не будет выбрана.

Например:

class A;

struct C 
{
    F(A* a)
    {
        delete a;  // OUCH!
    }
}

Microsoft С++ 2008 не вызовет никакого деструктора и не выдаст следующее предупреждение:

warning C4150: deletion of pointer to incomplete type 'A'; no destructor called
             : see declaration of 'A'

Итак, вы должны оставаться бдительными, что не должно быть проблемой, если вы рассматриваете предупреждения как ошибки.

Ответ 2

Из стандарта С++:

5.3.5/5:

"Если удаляемый объект имеет неполный тип класса в точке удаление, а полный класс имеет нетривиальный деструктор или функция освобождения, поведение undefined. "