PImpl 并不能使我免于导出 STL
PImpl Doesn't Save Me from having to Export STL
我追求 PImpl 设计以避免必须从我的动态库中导出 STL。
旧:
//In header file
class Foo{
public:
const map<char, char>& getMap() {return _map;}
private:
map<char, char> _map;
};
新:
//In header file
class Foo{
public:
Foo();
~Foo();
const map<char, char>& getMap();
private:
struct Impl;
Impl* _pimpl;
};
//In implementation file
struct Foo::Impl{
map<char, char> _map;
}
Foo::Foo(): _pimpl(new Impl){}
Foo::~Foo(){delete _pimpl;}
const map<char, char>& Foo::getMap(){return _pimpl->_map;}
然而,很明显的问题是我仍然 必须导出 map
作为我的库的一部分。我不想停止 returning STL,但我看不到解决它的方法。是否有另一种范例仍然可以让我 return STL 但不必导出它?
一个解决方案是不在 class 的接口中使用 std::map
,而是实现所需的方法子集。例如,假设您希望通过 operator[]
、
进行读写元素访问
// Foo.h
class Foo{
public:
Foo();
~Foo();
const char& operator[](char key) const;
char& operator[](char key);
private:
struct Impl;
Impl* _pimpl;
};
然后
// Foo.cpp
#include <map>
struct Foo::Impl
{
std::map<char, char> _map;
};
Foo::Foo() : _pimpl(new Impl){}
Foo::~Foo(){delete _pimpl;} // don't forget to take care of copy and assignment
const char& Foo::operator[](char key) const {return _pimpl->_map[key];}
char& Foo::operator[](char key) {return _pimpl->_map[key];}
我追求 PImpl 设计以避免必须从我的动态库中导出 STL。
旧:
//In header file
class Foo{
public:
const map<char, char>& getMap() {return _map;}
private:
map<char, char> _map;
};
新:
//In header file
class Foo{
public:
Foo();
~Foo();
const map<char, char>& getMap();
private:
struct Impl;
Impl* _pimpl;
};
//In implementation file
struct Foo::Impl{
map<char, char> _map;
}
Foo::Foo(): _pimpl(new Impl){}
Foo::~Foo(){delete _pimpl;}
const map<char, char>& Foo::getMap(){return _pimpl->_map;}
然而,很明显的问题是我仍然 必须导出 map
作为我的库的一部分。我不想停止 returning STL,但我看不到解决它的方法。是否有另一种范例仍然可以让我 return STL 但不必导出它?
一个解决方案是不在 class 的接口中使用 std::map
,而是实现所需的方法子集。例如,假设您希望通过 operator[]
、
// Foo.h
class Foo{
public:
Foo();
~Foo();
const char& operator[](char key) const;
char& operator[](char key);
private:
struct Impl;
Impl* _pimpl;
};
然后
// Foo.cpp
#include <map>
struct Foo::Impl
{
std::map<char, char> _map;
};
Foo::Foo() : _pimpl(new Impl){}
Foo::~Foo(){delete _pimpl;} // don't forget to take care of copy and assignment
const char& Foo::operator[](char key) const {return _pimpl->_map[key];}
char& Foo::operator[](char key) {return _pimpl->_map[key];}