gpt4 book ai didi

c++ - 在 C++ 中静默地将一个变量实例绑定(bind)到一个类?

转载 作者:行者123 更新时间:2023-11-28 08:29:49 25 4
gpt4 key购买 nike

所以我正在编写一个基于插件的系统。用户可以创建插件类的子类,然后它将在运行时加载并与系统的其余部分集成。当一个插件从系统运行时,它在一组插件的上下文中运行,我称之为 session 。

我的问题是,在用户插件中,可以使用两个名为 pf_ostream 和 pf_istream 的流类来向系统读取/写入数据。我想以某种方式将插件实例的 session 变量绑定(bind)到 pf_ostream 和 pf_istream 以便当用户实例化这些类时,它已经为他们绑定(bind)到 session (基本上我不希望他们看到 session 内部)

我可以只用一个宏来做到这一点,包装对构造函数的调用,例如:

#define MAKE_OSTREAM = pf_ostream_int(this->session)

但我认为可能有更好的方法。我查看了在包装 pf_ostream 的插件中使用嵌套类,但嵌套类似乎无法以某种闭包方式访问封闭类变量。

有谁知道一个巧妙的方法来做到这一点?

最佳答案

这是另一个基于您在其中一条评论中提到的工厂想法的答案。它使用 Facade 模式在绑定(bind)到 SessionSystem 类中集中创建系统设施:

#include <boost/shared_ptr.hpp>

class System
{
public:
typedef boost::shared_ptr<pf_ostream> pf_ostream_ptr;
typedef boost::shared_ptr<pf_istream> pf_istream_ptr;
// Other system facilities...

System(Session* session) : session_(session) {}

pf_ostream_ptr makeOstream()
{return pf_ostream_ptr(new pf_ostream(session_));}

pf_istream_ptr makeIstream()
{return pf_istream_ptr(new pf_istream(session_));}

private:
Session* session_;
};


class Plugin
{
public:
Plugin(System* system) : system_(system) {}

System& system() {return *system_;}

private:
System* system_;
};


class MyPlugin : public Plugin
{
public:
MyPlugin(System* system) : Plugin(system) {}

void print()
{
pf_ostream_ptr pfos( system().makeOstream() );
*pfos << "Hello World!\n";
// pfos will be deleted automatically at the end of this scope
}
};

如果您有很多系统设施,您应该明智地使用前向声明以避免编译时间过长。该解决方案的缺点是将您的系统设施集中在一个依赖性“焦点”(System 类)中。如果 System 类在使用或多或少系统设施的另一个应用程序中重新使用,则可能需要更改它。

编辑:

以下是如何应用代理模式(以及 Pimpl 习惯用法)来获得具有值语义的引用计数流类:

#include <boost/shared_ptr.hpp>

class pf_ostream
{
public:
pf_ostream(Session* session);
pf_ostream& operator<<(int rhs);
// Use of default copy-constuctor and assignment operator
// will work fine because of shared_ptr.

private:
struct Impl;
boost::shared_ptr<Impl> pimpl_;
};

// In cpp file

struct pf_ostream::Impl
{
Impl(Session* session) : session(session) {}
void insert(int rhs) {/*...*/}
Session* session;
};

pf_ostream::pf_ostream(Session* session) : pimpl_(new Impl(session)) {}

pf_ostream& pf_ostream::operator<<(int rhs) {pimpl_.insert(rhs); return *this;}

用户必须知道代理对象的拷贝将引用相同的真实流。希望这会有所帮助。

关于c++ - 在 C++ 中静默地将一个变量实例绑定(bind)到一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676658/

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