如何通过公共接口(C++)连接两个类(彼此不认识)

How can I connect two classes (which don't know eachother) through public interface (C++)

提问人:LPo 提问时间:3/31/2022 最后编辑:LPo 更新时间:3/31/2022 访问量:87

问:

我目前正在做一个项目,其中所有东西都可怕地混合在一起。每个文件都包含其他文件等。 我想将这个意大利面条代码的一个分离部分集中到一个库中,该库必须完全独立于代码的其余部分。

目前的问题是,我的库的某些函数 FunctionInternal 使用了一些在其他地方声明的函数 FunctionExternal,因此我的库包含项目中包含的一些其他文件,这不符合“独立于代码的其余部分”的要求。

不言而喻,我无法在我的库中移动 FunctionExternal

我解决这个问题的第一个想法是实现一个公共接口,如下所述:

enter image description here

但我无法让它工作。我的全局模式是我可以实现它的一种方式,还是有另一种方法,如果可能的话,连接两个函数,而不将一个文件包含在另一个文件中,从而导致不需要的依赖关系。

我怎样才能抽象我的 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;
};
C++ 接口 包括

评论

0赞 doctorlove 3/31/2022
我认为没有足够的细节来给出一个有用的答案。您使用的是类和 oo 还是免费函数?
1赞 paddy 3/31/2022
用代码示例描述你做了什么,这促使你说你无法让它工作。纯虚拟接口可能是要走的路,所以关于如何将其应用于问题的某些内容可能是不正确的,或者实际上并不合适。无论哪种方式,在你展示一个真实的例子之前,没有人能为你指出任何有用的方向。
0赞 The Coding Fox 3/31/2022
你使用的是 Visual Studio 吗?如果是,那么我相信有一种方法可以做到这一点。
0赞 LPo 3/31/2022
@paddy我编辑了我的答案。以为图表就足够了。
0赞 LPo 3/31/2022
@doctorlove我正在使用类和 OO

答:

1赞 pptaszni 3/31/2022 #1

您可以按照建议执行操作,在外部代码中覆盖内部接口。然后

我怎样才能在那里收到 External.h 中覆盖的InterfaceInternal_foo?

只需将指针/引用传递给 your 的扩展。当然,您需要有接受的方法。class Externalclass InterfaceInternalclass InternalInterfaceInternal*

或者,您可以将函数作为参数传递给内部接口。周围的东西:

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);
};