如何在不公开 C API 的情况下包装 C API
How would I wrap a C API without exposing the C API?
我想将 C API 包装成一组C++类,但同时这些类的使用者最好对 API 一无所知。
例如,包装 Lua 的 C API 尝试 1:
// State.hpp
#pragma once
struct lua_State;
class State {
private:
lua_State *state;
public:
State();
~State();
void runFile(char* name);
};
然后对于 cpp 文件:
// State.cpp
#include "State.h"
#include "lua.hpp"
State::State() {
state = luaL_newstate();
luaL_openlibs(state);
}
State::~State() {
lua_close(state);
}
void State::runFile(char* name) {
luaL_dofile(state, name);
}
这意味着包括 State.hpp 在内的任何文件都将看到lua_State,这是不可取的。我想要的是包括 State.hpp 在内的任何文件都看不到 C API 的任何部分,包括其结构,但我也不想在每个成员函数中使用 void* 或其他东西并强制转换为lua_State。我看到不透明的指针是做我想做的事的一种方法,但我看不到定义要lua_State私有结构的方法。
最简单的方法是转发声明项目。
struct lua_state;
这允许用户看到使用了称为lua_state的东西,但看不到详细信息。
痘痘
前向声明结构
struct hiddenData;
在类中使用此结构
class State {
private:
hiddenData *state;
public:
State();
~State();
void runFile(char* name);
};
在 cpp 文件中。
// State.cpp
#include "State.h"
#include "lua.hpp"
struct hiddenData {
lua_state * L;
// for ease of use...
hiddenData( lua_state * l ) : L(l) {}
}
State::State() {
state = new hiddenData( luaL_newstate() );
luaL_openlibs(state->L);
}
State::~State() {
lua_close(state->L);
}
void State::runFile(char* name) {
luaL_dofile(state->L, name);
}
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 在没有 API 的情况下使用谷歌翻译文本
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 我可以在没有C++的情况下学习 Win32 API(仅使用 C)吗?
- 如何在不公开 C API 的情况下包装 C API
- 在不使用API的情况下,如何在Windows中获取过程信息
- 如何在不弄乱库 API 的情况下实现条件编译?
- 我可以在不使用标准API功能的情况下创建过程
- 如何在没有Windows API的情况下在Turbo-C++中制作一个简单的文本编辑器
- 您可以在不使用核心音频 API 的情况下更改窗口中音量混合器/sndvol 中列出的程序名称吗?
- 使用WIN32 API在没有资源的情况下设置程序图标
- 在某些特殊情况下,Win32 ShowWindow api在Windows 7 SP1上的表现是否不同
- 如何在没有Win32 API的情况下制作一个简单的窗口
- 在c++中是否有一种方法可以在不使用windows api的情况下制作带有按钮和滚动条的自定义gui ?