如何通过 public 接口 (C++) 连接两个 类 (彼此不认识)
How can I connect two classes (which don't know eachother) through public interface (C++)
我目前正在做一个项目,所有的东西都可怕地混在一起。每个文件都包含一些其他文件等。
我想将这个意大利面条代码的分离部分集中到一个库中,该库必须完全独立于代码的其余部分。
当前的问题是我的库的一些函数 FunctionInternal 使用了一些在别处声明的函数 FunctionExternal,因此我的库包括一些项目中包含的其他文件,不符合“独立于代码的其余部分”的要求。
不用说,我无法在我的库中移动 FunctionExternal。
我解决这个问题的第一个想法是实现一个 public 接口,如下所述:
但我无法让它工作。我的全局模式是一种我可以实现它的方式还是有另一种方式,如果可能的话,连接两个函数而不将一个文件包含在另一个文件中导致不必要的依赖。
我如何抽象我的 ExternalClass 以便我的库仍然独立于我的代码的其余部分?
编辑 1:
External.h
#include "lib/InterfaceInternal.h"
class External : public InterfaceInternal {
private:
void ExternalFunction() {};
public:
virtual void InterfaceInternal_foo() override {
ExternalFunction();
};
};
Internal.h
#pragma once
#include "InterfaceInternal.h"
class Internal {
// how can i received there the InterfaceInternal_foo overrided in External.h ?
};
界面Internal.h
#pragma once
class InterfaceInternal {
public:
virtual void InterfaceInternal_foo() = 0;
};
您可以按照您的建议进行,在您的外部代码中覆盖内部接口。那么
// how can i received there the InterfaceInternal_foo overrided in External.h ?
只需将 pointer/reference 传递给扩展 class InterfaceInternal
的 class External
。当然你的 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);
};
我目前正在做一个项目,所有的东西都可怕地混在一起。每个文件都包含一些其他文件等。 我想将这个意大利面条代码的分离部分集中到一个库中,该库必须完全独立于代码的其余部分。
当前的问题是我的库的一些函数 FunctionInternal 使用了一些在别处声明的函数 FunctionExternal,因此我的库包括一些项目中包含的其他文件,不符合“独立于代码的其余部分”的要求。
不用说,我无法在我的库中移动 FunctionExternal。
我解决这个问题的第一个想法是实现一个 public 接口,如下所述:
但我无法让它工作。我的全局模式是一种我可以实现它的方式还是有另一种方式,如果可能的话,连接两个函数而不将一个文件包含在另一个文件中导致不必要的依赖。
我如何抽象我的 ExternalClass 以便我的库仍然独立于我的代码的其余部分?
编辑 1:
External.h
#include "lib/InterfaceInternal.h"
class External : public InterfaceInternal {
private:
void ExternalFunction() {};
public:
virtual void InterfaceInternal_foo() override {
ExternalFunction();
};
};
Internal.h
#pragma once
#include "InterfaceInternal.h"
class Internal {
// how can i received there the InterfaceInternal_foo overrided in External.h ?
};
界面Internal.h
#pragma once
class InterfaceInternal {
public:
virtual void InterfaceInternal_foo() = 0;
};
您可以按照您的建议进行,在您的外部代码中覆盖内部接口。那么
// how can i received there the InterfaceInternal_foo overrided in External.h ?
只需将 pointer/reference 传递给扩展 class InterfaceInternal
的 class External
。当然你的 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);
};