这可能包裹提高卯与Pimpl?
-
06-07-2019 - |
题
在一个项目,我们希望包升Asio座中的一个方式,即采用类或包装。h不包括提高标题。
我们通常使用的指针,并向声明,对包裹的课程。
Foward宣言:
namespace boost
{
namespace asio
{
namespace ip
{
class udp;
}
}
}
然后宣布的座:
scoped_ptr<boost::asio::ip::udp::socket> socket_;
scoped_ptr<boost::asio::ip::udp::endpoint> receiveEp_;
(如果你不知道scoped_ptr,忽略它,问题是平等的标准*指针。)
但这给了一个编译器的错误:
error C2027: use of undefined type 'boost::asio::ip::udp'
我明白这是因为udp实际上不是一个名字空间,但一类本身。我们只希望使用内流虽然任何想法?
解决方案
与内的类型你唯一的选择是包裹的一切。隐藏范围的指针自己内部的一个前宣布类。用户将会看到的只有你API和绕过自己的对象,而不是提升对象。
在你的实例,虽然scoped_ptr看起来像私有成员的声明,你可以逃脱,简单:
// header
class SomeClass
{
public:
SomeClass();
// stuff
private:
scoped_ptr<class pimpl_bla> _m;
};
// source
class pimpl_bla
{
public:
scoped_ptr<boost::asio::ip::udp::socket> socket_;
};
SomeClass::SomeClass()
:_m(new pimpl_bla)
{
}
其他提示
如果您正在使用pimpl,为什么要将成员变量放在标题中?套接字和端点类型是否在您的界面中使用?如果它们不是你的界面的一部分,那么pimpl习语的重点在于你没有在头文件中定义一个类的成员变量;它们是实施细节。
我希望在头文件中有这样的东西:
// ...
class MyClass {
public:
MyClass();
// .. Other member functions
private:
struct Imp;
boost::shared_ptr<Imp> m_imp; // This is the only member variable.
};
然后在您的实施文件中:
#include <boost/asio/whatever.hpp>
struct MyClass::Imp
{
scoped_ptr<boost::asio::ip::udp::socket> socket_;
scoped_ptr<boost::asio::ip::udp::endpoint> receiveEp_;
// Remainder of implementation class ...
};
// Other implementation details.
要回答您的具体问题,您尝试使用的类型是asio udp类中的typedef,因此编译器需要看到该类的定义才能使用它。
不隶属于 StackOverflow