"api design for c++": c++ 疙瘩访问

"api design for c++": c++ pimple access

我正在尝试理解 "api design for c++" 书中(第 70 页)中的一个粉刺示例。

// autotimer.h
class AutoTimer
{
public:
    explicit AutoTimer(const std::string &name);
    AutoTimer();
    // allow access from other classes/functions in autotimer.cpp
    class Impl;
private:
    Impl* mImpl;
}

根据文本和示例,我假设可以从 autotimer.cpp 中声明的自由函数访问 AutoTimer::Impl 的成员,例如下面示例中的 free_f()

// autotimer.cpp
class AutoTimer::Impl
{
 public:
    std::string s;
}

void free_f(AutoTimer a){
    std::cout << a.mImpl->s << std::endl;
}

但是,我无法让它工作。遗憾的是,这本书没有提供任何进一步的细节。那么,如何修复 free_f() 以访问 Impl 的私有成员?

更明确地说,评论(和第一个例子)

// allow access from other classes/functions in autotimer.cpp

直接来自书"api design for c++",我想知道它是什么意思。

这是未经测试的,但如果您的对象是标准布局类型,它应该是合法的 C++:

void free_f(AutoTimer a){
    Impl* tmp = *reinterpret_cast<Impl**>(&a);
    std::cout << tmp->s << std::endl;
}

并且由于您使用的是 Pimpl,因此您应该传递 AutoTimer 类型的引用或指针。否则临时对象将在销毁时销毁您的实现对象。

http://en.cppreference.com/w/cpp/language/data_members#Standard_layout