gpt4 book ai didi

c++ - 如何在不公开 C API 的情况下包装 C API?

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:20 24 4
gpt4 key购买 nike

我想将 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成员函数。我看到了 opaque pointers是做我想做的事情的一种方法,但我没有看到将私有(private)结构定义为 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);
}

关于c++ - 如何在不公开 C API 的情况下包装 C API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44193546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com