如果標題不太合理,下面是一個精簡的例子。考慮這個myclass.h:如何從C中的extern「C」friend函數訪問類的不透明實現?
// Compiled with g++ 4.7 and -std=c++0x -pedantic -Wall -Wextra on Linux
class myclass {
public:
myclass()=default;
void init();
private:
struct myclassImpl;
static myclassImpl _impl;
}`
和myclass.cpp
#include <csignal>
using namespace std;
#include "myclass.h"
extern "C" {
void end_sig(int);
}
struct myclass::myclassImpl {
friend void end_sig(int);
myclassImpl()=default;
void cleanup();
}
myclass::myclassImpl myclass::_impl;
extern "C" {
void end_sig(int /* sig */) {
myclass::_impl.cleanup();
}
}
void myclass::init() {
signal (SIGINT, end_sig);
}
void myclass::myclassImpl::cleanup() {
// stuff...
}
正如你所看到的,我想實現的橋樑或PIMPL模式(與模式的Monostate雖然我不認爲它與這個特定的問題有關)。大多數情況下,它可以工作,但在這個特定的實現中,而不是其他的,我必須建立一個信號處理程序,它必須是一個外部「C」函數而不是該類的一個方法。如果代碼設置這樣的,我得到以下錯誤:
In function ‘void end_sig(int)’:
error: ‘myclass::myclassImpl myclass::_impl’ is private
我能想到的解決此兩種方式。
- 將朋友聲明移到myclass中。
- make _impl public。
但是在這兩種情況下,它會違反界面和執行權的分離嗎?有沒有更好的選擇?
你不能有一個getter,返回一個指向proc/func /方法的指針,無論哪個術語在這個上下文中是合適的? – 2013-05-10 19:25:56
如果所有成員都已經公開,myClassImpl中的friend語句不會執行任何操作。 – krsteeve 2013-05-10 19:57:23