gpt4 book ai didi

c++ - 有趣的C++依赖注入(inject)方案

转载 作者:行者123 更新时间:2023-11-30 03:19:08 26 4
gpt4 key购买 nike

背景:我是 C++ 的新手。我有一个 C# 项目,我想将其转换为 C++,以获得编写一些有用的 C++ 代码的经验,而不是教科书示例。为此,我检查了一些开源项目的代码以获得真正的 C++ 的感觉,并且还尝试在一个相当老的项目中进行一些重构,在调试构建中使用一些 valgrind 操作和一些临时统计信息来确认正确性(所有有实际输入)。 (几年前我用 C++ 完成了一个大学项目,但我不认为那是任何实际经验)。

实际问题:

我试图转换为 C++ 的 C# 项目使用轻量级依赖注入(inject)。每个类在构造函数中接收一个“上下文”对象。它首先将自己插入到“上下文”中,然后再查询自己的依赖关系,这样循环依赖就不成问题了。

经过深思熟虑,我想到了以下 C++ 方案。每个 DI 对象在构造函数中通过引用接收其依赖项。我将所有 DI 对象字段都放在一个类中(按值作为子对象)并将它们连接到初始化列表中。

// Yes, the project is compiler for a toy programming language
class Compiler {
Logger log;
Options options;
ParserDriver parserDriver;
DeclarationAnalysis declarationAnalysis;
CodeTypeAnalysis codeTypeAnalysis;
FlowAnalysis flowAnalysis;
CodeGeneration codeGeneration;
Check check;
Typings typings;
Operators operators;
Symtab symtab;
public:
Compiler();
};

Compiler::Compiler() :
log(),
options(),
parserDriver(log),
declarationAnalysis(log, symtab, check),
codeTypeAnalysis(log, symtab, operators, typings, check),
flowAnalysis(log),
codeGeneration(typings, symtab),
check(log, symtab),
typings(symtab),
operators(symtab, log, typings),
symtab()
{}

// Example DI object
class DeclarationAnalysis {
Logger* log;
Symtab* symtab;
Check* check;
public:
DeclarationAnalysis(Logger&, Symtab&, Check&);
}

DeclarationAnalysis::DeclarationAnalysis(Logger& log, Symtab& symtab, Check& chack)
: log(&log), symtab(&symtab), check(&check) {}

这样的代码是否安全,没有未定义的行为(例如,symtab 最后初始化但作为参数提供给其他字段的构造函数)?乍一看似乎非常优雅。内存是打包的,甚至可以在栈上分配。我是否重新发现了现有模式?

最佳答案

为了对象在类中的存在,调用构造函数初始化列表。编译器可以设置为 warn.if 构造函数列表是不同的顺序。打开它。

您可以引用未初始化的值并传递它们。除了存储对那些未初始化对象的指针或引用之外的任何事情都不是一个好计划。

在您的示例代码中,您仅存储指针。那是安全的。

这些类型的析构函数不能假定指向的对象存在,因为在 Compiler 构造过程中,它可能会失败(通过异常)并导致已构造的子对象的破坏。这很难做到正确。

关于c++ - 有趣的C++依赖注入(inject)方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53988009/

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