У меня есть класс, как это:C++: auto_ptr + форвардная декларация?
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
Inner* m_inner;
};
в .cpp, конструктор создает экземпляр Inner
с new
и деструктор delete
все. Это работает очень хорошо.
Теперь я хочу, чтобы изменить этот код, чтобы использовать auto_ptr
пишу я так:
class Inner;
class Cont
{
public:
Cont();
virtual ~Cont();
private:
std::auto_ptr<Inner> m_inner;
};
Теперь конструктор инициализации auto_ptr
и деструктор ничего не делает.
Но это не работает. проблема возникает, когда я создаю этот класс. Я получаю это предупреждение:
предупреждение C4150: удаление указателя на неполный тип 'Внутренний'; нет деструктора называется
Ну, это не очевидно, очень плохо, и я понимаю, почему это происходит, компилятор не знает о d'торе из Inner
при инстанцировании шаблона auto_ptr<Inner>
Так что мой вопрос : Есть ли способ использовать auto_ptr
с форвардным объявлением, как в версии, использующей только простые указатели?
Имея #include
каждый класс, я объявляю указатель на огромную проблему, а порой просто невозможно. Как обычно эта проблема обрабатывается?
Я использовал эту проблему, когда объявил пустой деструктор (или вообще не объявлял его) в файле заголовка класса Cont. Из вашего примера там вы, кажется, делаете это правильно, но просто хотели подчеркнуть эту проблему. – rui
Древо объявлено в cpp, и я получаю предупреждение о создании экземпляра 'auto_ptr' внутри класса. – shoosh