#c #pimpl-idiom
#c #pimpl-идиома
Вопрос:
Я решил проблему, поставив #include "stdafx.h"
(это утверждение пропущено в исходном вопросе, извините за это) ПЕРЕД #include "PImplTest.h"
, а не ПОСЛЕ него.
Но я все еще не понимаю, почему он не может остаться после него.
// stdafx.h
#include <tinyxml2.h>
#include <queue>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <string>
#include <memory>
#include <assert.h>
———————— исходный вопрос ———————————
Я пытаюсь использовать шаблон PImpl в C . Файл заголовка:
// PImplTest.h
#pragma once
#include <memory>
class PImpl
{
private:
class Impl;
std::unique_ptr<Impl> m_impl;
};
Что меня смущает, так это то, что если я реализую Impl
класс в соответствующем cpp-файле заголовка следующим образом:
// PImplTest.cpp
#include "PImplTest.h"
#include "stdafx.h" // this statement was missed in my first post
class PImpl::Impl // error C2079 'Impl' uses undefined class 'PImpl'
{ // error C2653 'PImpl':is not a class or namespace name
};
// main.cpp
#include "stdafx.h" // this statement was missed in my first post
#include "PImplTest.h"
int main()
{
return 0;
}
VS сообщает о 2 ошибках в комментариях к коду выше. Однако, если он реализован в файле, подобном этому:
// main.cpp
#include "PImplTest.h"
class PImpl::Impl
{
};
int main()
{
return 0;
}
Тогда ничего не пойдет не так.
В чем проблема? Как это исправить?
Комментарии:
1.Это единственные
#include
директивы, и, в частности, есть ли у вас другие заголовки, которые включают или включеныPImplTest.h
?2. нет, это весь код
3. Внимание: вам нужно будет добавить
~Pimpl();
в свой заголовок иPimpl::~Pimpl() = defau<
в свой cpp-файл, чтобыstd::unique_ptr
Impl
по завершении был создан экземпляр деструктора.4. Является ли сообщение об ошибке, которое вы цитируете, первым сообщением об ошибке, выводимым компилятором?
5. Я очень сожалею, что пропустил строку кода ПОСЛЕ «#include»PImplTest.h»» в файле PImplTest.cpp в первом случае это «#включить «stdafx.h»». Когда я помещаю его ПЕРЕД инструкцией include в PImplTest.h, все правильно. Но я все еще в замешательстве, почему включение pch должно оставаться перед включением PImplTest.h?