提问人:LPo 提问时间:3/31/2022 最后编辑:LPo 更新时间:3/31/2022 访问量:87
如何通过公共接口(C++)连接两个类(彼此不认识)
How can I connect two classes (which don't know eachother) through public interface (C++)
问:
我目前正在做一个项目,其中所有东西都可怕地混合在一起。每个文件都包含其他文件等。 我想将这个意大利面条代码的一个分离部分集中到一个库中,该库必须完全独立于代码的其余部分。
目前的问题是,我的库的某些函数 FunctionInternal 使用了一些在其他地方声明的函数 FunctionExternal,因此我的库包含项目中包含的一些其他文件,这不符合“独立于代码的其余部分”的要求。
不言而喻,我无法在我的库中移动 FunctionExternal。
我解决这个问题的第一个想法是实现一个公共接口,如下所述:
但我无法让它工作。我的全局模式是我可以实现它的一种方式,还是有另一种方法,如果可能的话,连接两个函数,而不将一个文件包含在另一个文件中,从而导致不需要的依赖关系。
我怎样才能抽象我的 ExternalClass,以便我的库仍然独立于我的其余代码?
编辑1:
外部.h
#include "lib/InterfaceInternal.h"
class External : public InterfaceInternal {
private:
void ExternalFunction() {};
public:
virtual void InterfaceInternal_foo() override {
ExternalFunction();
};
};
内部.h
#pragma once
#include "InterfaceInternal.h"
class Internal {
// how can i received there the InterfaceInternal_foo overrided in External.h ?
};
接口内部.h
#pragma once
class InterfaceInternal {
public:
virtual void InterfaceInternal_foo() = 0;
};
答:
1赞
pptaszni
3/31/2022
#1
您可以按照建议执行操作,在外部代码中覆盖内部接口。然后
我怎样才能在那里收到 External.h 中覆盖的InterfaceInternal_foo?
只需将指针/引用传递给 your 的扩展。当然,您需要有接受的方法。class External
class InterfaceInternal
class Internal
InterfaceInternal*
或者,您可以将函数作为参数传递给内部接口。周围的东西:
class InterfaceInternal {
public:
void InterfaceInternal_foo(std::function<void()> f);
};
或更通用:
class InterfaceInternal {
public:
template <typename F> // + maybe some SFINAE magic, or C++20 concept to make sure it's actually callable
void InterfaceInternal_foo(F f);
};
评论