【问题标题】:Avoid global object in C++ library避免 C++ 库中的全局对象
【发布时间】:2014-07-23 14:30:54
【问题描述】:

我有一些 C++ 库,为它的客户端提供本地 C API。事实上,这个库是一些类实例的包装器,API 调用应该使用同一个类实例,使用它的公共接口,例如:

// library API, using class methods internally
MYDLL_API uint8_t __stdcall init();
MYDLL_API uint8_t __stdcall release();
MYDLL_API uint8_t __stdcall setSomething();
MYDLL_API uint8_t __stdcall doSomething();

// some inernal class
class Foo{
public:
    void setSomething();
    void doSomething();
private
    // some state
};

提供所有 API 调用能力以使用相同的 Foo 实例的唯一方法是使用此类的全局实例,可能是单例。我想避免使用全局变量,怎么实现?

【问题讨论】:

    标签: c++ c dll global


    【解决方案1】:

    一种可能性是将您创建的实例的 void 指针返回给调用者,并让调用者将其传递给所有函数。库可以将该指针转换为正确的类型并调用实例上的方法。

    它并不漂亮,但你想要一个 C API,那么你能期待什么。

    【讨论】:

      【解决方案2】:

      看起来像一个糟糕的设计,库应该在多线程环境中工作。这种对“所有 API 调用都可以使用同一个 Foo 实例的能力”的需求防止了非常很糟糕的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-24
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        相关资源
        最近更新 更多