我是C++新手,现在我有一个问题需要解决。我在A库中有一个类,在B库中有一个类,C函数是A和B之间的唯一连接,我需要传递在A中实现的类,并在B中运行它,在C函数中最好的方法是什么?在A库中
class ClassAImp : public ClassA
{
public:
ClassAImp();
~ClassAImp();
void Setup() override {/* do some setup */};
void TearDown() override {/* do teardown stuff */};
void runMethodA(void* ptr) override {/* do method A stuff */};
}
class ClassA
{
public:
virtual void Setup() = 0;
virtual TearDown() = 0;
virtual runMethodA(void* ptr) = 0;
}
在图书馆B
class ClassB
{
public:
virtual void Setup() = 0;
virtual TearDown() = 0;
virtual runMethodA(void* ptr) = 0;
}
现在我在C语言中做的是
class ClassBImp : public ClassB
{
public:
ClassBImp(std::shared_ptr<ClassA> _classAObj) : classAObj(_classAObj) {};
virtual ~ClassBImp();
void Setup() override { if (classAObj) classAObj->Setup(); };
void TearDown() override { if (classAObj) classAObj->TearDown(); };
void runMethodA(void* ptr) override { if (classAObj) classAObj->runMethodA(ptr); };
private:
std::shared_ptr<ClassA> classAObj;
}
并将ClassBImpPtr(作为std::shared_ptr)传递给B库。
我对库A或B没有任何控制权,只能在C中执行操作,并将实现的对象传递回B。这是在C++中执行操作的正确方法吗(11?)有更好的方法吗?
3条答案
按热度按时间vmdwslir1#
因为您得到的是一个已经构造好的
ClassAImpl
对象,所以这差不多是它得到的最好结果。wqsoz72f2#
最好的情况是库A和库B使用类型擦除,这样它们就可以接受任何没有继承的类型。
如果你不能做到这一点,你可以为库编写适配器:
然后使用这个函数,你可以让任何类型使用
ClassB
,只要该类型声明了3函数:然后,您可以使用适配器将该类型发送到两个库:
当然,如果需要,您可以让适配器包含指针,以便将
MyClassThatWorksWithBoth
的同一个示例发送到两个库。请注意,使用适配器时,您不需要使type具有多重继承。
pgpifvop3#
我想您可能对代码重复(愚蠢的重复!)感到不快。有些重复在委托中是不可避免的(这里:让一个现有的实现-
ClassBImp
-做另一个接口的-ClassA
的-工作)。但是,如果你只是简单地从接口和实现继承,你就不必创建一个单独的
ClassAImp
对象--你的类 * 是-a *ClassB
--,而且转发也可以说更简单,因为你只需要用实现类名来限定你调用来做这项工作的函数:再简单不过了。
让我们假设库B中的一个函数需要一个指向
ClassB
的共享指针(并且我进一步假设这个函数很可能调用我们传递指针到的ClassB
对象的成员函数):然后你可以用
也就是说,当需要指向base的共享指针时,可以提供指向派生的共享指针,就像常规指针一样;它们是协变的。