[英]How can I connect two classes (which don't know eachother) through public interface (C++)
我目前正在從事一個項目,其中所有內容都可怕地混合在一起。 每個文件都包含一些其他文件等。我想將這個意大利面條代碼的分離部分集中到一個庫中,該庫必須完全獨立於代碼的 rest。
目前的問題是我的庫的一些函數FunctionInternal使用了一些在別處聲明的函數FunctionExternal ,因此我的庫包含了項目中包含的一些其他文件,這不符合“獨立於代碼的rest”的要求。
不用說,我不能在我的庫中移動FunctionExternal 。
我解決這個問題的第一個想法是實現一個公共接口,如下所述:
但我無法讓它工作。 我的全局模式是一種我可以實現它的方式還是有另一種方式,如果可能的話,連接兩個函數而不將一個文件包含在另一個文件中導致不必要的依賴。
我如何抽象我的 ExternalClass 以便我的庫仍然獨立於我的代碼的 rest?
編輯 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 ?
};
InterfaceInternal.h
#pragma once
class InterfaceInternal {
public:
virtual void InterfaceInternal_foo() = 0;
};
您可以按照您的建議進行操作,覆蓋外部代碼中的內部接口。 然后
// 我怎樣才能收到在 External.h 中覆蓋的 InterfaceInternal_foo?
只需將指針/引用傳遞給擴展class InterfaceInternal
的class External
。 當然,您的class Internal
需要有接受InterfaceInternal*
的方法。
或者您可以將 function 作為參數傳遞給您的內部接口。 周圍的東西:
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);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.