我在代码中大量使用pimpl idiom,主要是为了减少编译时间。
我有一种情况,我正在调用C库。我有一个C ++包装器类,它有它的接口,并且血腥细节都在impl
中,当然:
class some_class {
public:
void some_init();
...
private:
class impl;
std::unique_ptr<impl> m_pimpl;
}
在cpp文件中,我必须在C库中注册一个回调,在那里我给它一个指针。我想将此函数调用转发给相应的成员函数。客户(即该功能的用户)根本不必知道这个细节:
static void from_c_func(void *ptr_to_class_impl) {
static_cast<some_class::impl *>(ptr_to_class_impl)->from_c_func();
}
void some_class::some_init() {
create_c_thing(static_cast<void *>(this->m_pimpl.get()), from_c_func);
}
问题是some_class::impl
被声明为私有。我只能想到不完美的解决方案:
class impl;
。这不是理想的,因为它确实应该是private
- 它恰好是非类函数需要看到它的实现细节。from_c_func
放入头文件并friend
。这并不理想,因为some_class
的实施细节正在泄漏。更改实现可能需要更改头文件,然后重新编译许多不需要重新编译的东西,这会让我感到不快。from_c_func
指向some_class
本身的指针,然后调用some_class
上的函数。这需要将该函数放在头文件中,这也是一个实现细节 - 无论如何它必须是public
非朋友函数才能调用它。怎么办?到目前为止,我最好的选择似乎是#1,但还有更好的方法吗?
答案 0 :(得分:2)
您可以在mysql_query("INSERT INTO $table (lastname,id) VALUES('$lastname',NULL)");
impl