|
|
1
19
假设一个类(plugin1)继承自SomeManagerClass,则需要一个类层次结构来构建类型:
最后,您的TheManager只需要知道插件的名称(作为字符串),并且只需一行代码即可返回SomeManagerClass类型的对象:
编辑
我认为这是一个更好的解决方案。此外,如果您传递costructor字符串,“plugin\u factory”类可以将自己添加到“factory\u map”中。 |
|
|
2
10
我认为这里有两个不同的问题。 一个问题是:管理者如何 名称 它必须创建的类?它必须保留某种指向“创建类的方法”的指针。可能的解决办法是: 另一个问题是:“创建类的方法”是什么?不幸的是,我们不能直接存储指向构造函数的指针,但我们可以:
在这两种情况下,模板都有助于避免不必要的代码重复。 |
|
|
3
3
|
|
4
2
我将创建一个“基本”工厂,该工厂具有用于创建所有基本管理器的虚拟方法,并让“元管理器”(您问题中的管理器)将指向基本工厂的指针作为构造函数参数。 我假设“工厂”可以通过从CXYZWManager派生来自定义CXYZWManager的实例,但CXYZWManager的构造函数也可以在“自定义”工厂中使用不同的参数。 输出“CSomeManager”和“cderivedfromomemanager”的冗长代码示例:
|
|
|
5
2
这是我想到的解决方案,它不是最好的,但也许它有助于想出更好的解决方案: 每个类都有一个creator类:
这个解决方案的问题在于它违反了DRY——对于每个类创建者,我都必须在创建者中编写setter/getter。 |
|
|
6
2
编辑 :在阅读其他答案时,我意识到这与Dave Van den Eynde的FactorySystem解决方案非常相似,但我使用的是函数模板指针,而不是实例化模板化的工厂类。我认为我的解决方案更轻一点。由于使用静态函数,唯一实例化的对象是映射本身。如果您需要工厂执行其他功能(DestroyManager等),我认为他的解决方案更具可扩展性。 |
|
|
7
1
编辑:我会尝试给出一些代码,但是要注意我的C++时间相当长,我现在只做java和一些脚本。
现在,您应该能够通过(如果您已经能够使代码示例正常工作)呼叫工厂:
|
|
|
8
1
我会使用这样的模板,因为我看不出工厂类的意义:
|
|
|
9
1
http://downloads.sourceforge.net/papafactory/PapaFactory20080622.pdf?use_mirror=fastbull 它包含了C++中实现抽象工厂的一个很好的教程,它附带的源代码也非常健壮。 克里斯 |
|
|
10
0
根据将创建哪个类的决策将在何处做出,您必须使用标识符进行创建(如上所述),或者处理要在内部实例化哪个管理器的决策。 另一种方法是像使用模板一样实现it“策略”。因此,您可以使用ManagerClass::create()返回特定的SomeOtherManagerWhatver实例。这将在使用您的经理的代码中确定要由哪个经理做出决定-可能这不是故意的。
(或诸如此类) 同样,用于此目的的类可能有点过头了。在您的情况下,我想工厂函数就可以了。这更多的是个人偏好的问题。 |
|
|
11
0
如果你计划支持动态链接的插件,你的程序需要提供一个稳定的ABI(应用二进制接口),这意味着你不能使用C++作为你的主接口,因为C++没有标准的ABI。 如果你想让插件实现你自己定义的接口,你必须向插件程序员提供接口的头文件,并在一个非常简单的C接口上进行标准化,以便创建和删除对象。 您不能提供一个动态库来允许您按原样“新建”插件类。这就是为什么需要在C接口上进行标准化以创建对象。使用C++对象是可能的,只要您的参数都不使用可能不兼容的类型,例如STL容器。您将无法使用另一个库返回的向量,因为您无法确保它们的STL实现与您的相同。 经理
PluginManager.h
PluginManager.cpp
|
|
|
12
0
听起来您需要一个抽象基类和一个指向当前使用的类的指针。如果您希望链接,可以在抽象类和管理器类中进行链接。如果是抽象类,则将一个成员添加到链中的下一个类中,如果是管理器,则按列表中要使用的顺序对其进行排序。您需要一种添加类的方法,因此在管理器中需要一个addMe()。听起来你知道你的选择应该是正确的。我建议使用一个带有addMe func的列表,如果您只需要一个活动类,则可以使用管理器中的一个函数来确定它是否合适。 |
|
|
13
0
这可能比您需要的要重,但听起来您正试图创建一个支持插件的框架类。
1) 框架类将拥有这些插件。 这个类负责发布插件提供的接口。 2) 插件类将拥有完成该工作的组件。 此类负责注册导出的接口,并将导入的接口绑定到组件。 3) 第三部分,组件是接口的供应商和消费者。
把事情搞糟。
class IFrameWork {
public:
virtual ~IFrameWork() {}
virtual void RegisterInterface( const char*, void* ) = 0;
virtual void* GetInterface( const char* name ) = 0;
};
class IPlugIn {
public:
virtual ~IPlugIn() {}
virtual void BindInterfaces( IFrameWork* frameWork ) {};
virtual void Start() {};
virtual void Stop() {};
};
struct SamplePlugin :public IPlugIn {
ILogger* logger;
Component1 component1;
WebServer webServer;
public:
SamplePlugin( IFrameWork* frameWork )
:logger( (ILogger*)frameWork->GetInterface( "ILogger" ) ), //assumes the 'System' plugin exposes this
component1(),
webServer( component1 )
{
logger->Log( "MyPlugin Ctor()" );
frameWork->RegisterInterface( "ICustomerManager", dynamic_cast( &component1 ) );
frameWork->RegisterInterface( "IVendorManager", dynamic_cast( &component1 ) );
frameWork->RegisterInterface( "IAccountingManager", dynamic_cast( &webServer ) );
}
virtual void BindInterfaces( IFrameWork* frameWork ) {
logger->Log( "MyPlugin BindInterfaces()" );
IProductManager* productManager( static_cast( frameWork->GetInterface( "IProductManager" ) ) );
IShippingManager* shippingManager( static_cast( frameWork->GetInterface( "IShippingManager" ) ) );
component1.BindInterfaces( logger, productManager );
webServer.BindInterfaces( logger, productManager, shippingManager );
}
virtual void Start() {
logger->Log( "MyPlugin Start()" );
webServer.Start();
}
virtual void Stop() {
logger->Log( "MyPlugin Stop()" );
webServer.Stop();
}
};
class FrameWork :public IFrameWork {
vector plugIns;
map interfaces;
public:
virtual void RegisterInterface( const char* name, void* itfc ) {
interfaces[ name ] = itfc;
}
virtual void* GetInterface( const char* name ) {
return interfaces[ name ];
}
FrameWork() {
//Only interfaces in 'SystemPlugin' can be used by all methods of the other plugins
plugIns.push_back( new SystemPlugin( this ) );
plugIns.push_back( new SamplePlugin( this ) );
//add other plugIns here
for_each( plugIns.begin(), plugIns.end(), bind2nd( mem_fun( &IPlugIn::BindInterfaces ), this ) );
for_each( plugIns.begin(), plugIns.end(), mem_fun( &IPlugIn::Start ) );
}
~FrameWork() {
for_each( plugIns.rbegin(), plugIns.rend(), mem_fun( &IPlugIn::Stop ) );
for_each( plugIns.rbegin(), plugIns.rend(), Delete() );
}
};
|
|
|
14
0
只需拷贝&粘贴到VS2005/2008中的初始Win32控制台应用程序上。我想指出一点:
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |