gpt4 book ai didi

C++ 依赖注入(inject)方式——模板还是虚拟方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:03 24 4
gpt4 key购买 nike

我想知道使用依赖注入(inject)的 C++ 方式是什么?那是使用模板还是多态类?考虑以下代码,

class AbstractReader
{
public:
virtual void Read() = 0;
};

class XMLReader : public AbstractReader
{
public:
void Read() { std::cout << "Reading with a XML reader" << std::endl; }
};

class TextFileReader : public AbstractReader
{
public:
void Read() { std::cout << "Reading with a Text file reader" << std::endl; }
};

class Parser
{
public:
Parser(AbstractReader* p_reader) : reader(p_reader) { }
void StartParsing() { reader->Read();
// other parsing logic
}
private:
AbstractReader* reader;
};

template<class T>
class GenericParser
{
public:
GenericParser(T* p_reader) : reader(p_reader) { }

void StartParsing()
{
reader->Read();
}
private:
T* reader;
};

1 - 哪种方法最好? GenericParser 还是 Parser?我知道如果是GenericParser,可以去掉继承。

2 - 如果模板是可行的方法,是否可以将所有代码都写在头文件中?我已经看到许多使用模板的类将所有代码写入头文件而不是 .h/.cpp 组合。这样做有什么问题吗,比如内联等?

有什么想法吗?

最佳答案

根据您希望如何构建代码或头文件,您在这方面没有自由选择。答案由您的应用要求决定。

这取决于耦合是可以在编译时决定还是必须延迟到运行时

如果一个组件和它的依赖之间的耦合是在编译时永久决定的,你可以使用模板。然后编译器将能够执行内联。

但是,如果耦合需要在运行时决定(例如,用户选择哪个其他组件将提供依赖性,可能通过配置文件),那么你不能为此使用模板,你必须使用运行时多态机制.如果是这样,您的选择包括虚函数、函数指针或 std::function

关于C++ 依赖注入(inject)方式——模板还是虚拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/931456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com