"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
我正在尝试理解 "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