gpt4 book ai didi

c++ - 在初始化列表中初始化许多对象成员变量

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:58 25 4
gpt4 key购买 nike

我有一个关于在一个类中初始化多个对象成员的最佳实践的问题。这个问题的背景是一个嵌入式项目,我经常在其中使用引用和构造函数注入(inject):

class ComponentA 
{
public:
ComponentA(SomeComponent1& dependency1, SomeComponent2& dependeny2)

private:
/* ... */
};

现在假设我有许多其他类,例如 ComponentA,它们必须在一个类中实例化:

class Layer
{
private:
ComponentA componentA; // Composition
/* ...and many other components */

public:
Layer(SomeComponent1& firstDepOfA, SomeComponent2& secondDepOfA, ...) :
componentA(firstDepOfA, secondDepOfA), /* other components */
};

我在想构建器模式来降低复杂度:

class Layer
{
private:
ComponentA componentA; // Composition
/* ...and many other components */

/* now private */
Layer(SomeComponent1& firstDepOfA, SomeComponent2& secondDepOfA, ...) :
componentA(firstDepOfA, secondDepOfA), /* other components */

public:
ComponentAIntf& getComponentA ( ... );

class Builder
{
private:
SomeComponent1* firstDepOfA;
SomeComponent2* secondDepOfA;
/* other dependencies/constructor parameters */

public:
/* returns Builder, because we want a fluent api */
Builder& setFirstDepOfA(SomeComponent1* dep) {firstDepOfA = dep; return *this;}
Builder& setSecondDepOfA(SomeComponent2* dep) {secondDepOfA = dep; return *this;}

Layer& build()
{
/* check parameters */
...

/* create instance, constructor will be called once when scope is entered */
static Layer layer(/* parameters */);
return layer;
}
}
};

构建器类的一个主要缺点是成员实例的构造函数参数是重复的。我认为这也可以通过模板来实现,但我还没有找到任何资源。一个例子会很好,但我想避免使用模板。任何帮助表示赞赏。我想我错过了什么......

提前致谢

最佳答案

在这里使用构建器模式会很危险,因为您可能会在设置所有依赖项之前调用 build。 (使用构造函数注入(inject)的原因之一是防止类在没有明确指定其所有依赖项的情况下被实例化。)

您应该将 ComponentA 注入(inject)到 Layer 中,而不是让它直接创建其依赖项。例如:

class Layer
{
private:
ComponentA& componentA; // Composition
/* ...and many other components */

public:
Layer(ComponentA& componentA, ...) :
componentA(componentA), /* other components */
};

当使用依赖注入(inject)时,你最终应该有一个 composition root您实际构建对象图的地方。 (这是所有依赖注入(inject)实际发生的地方。)

如果需要按需实例化ComponentA,那么可以考虑将责任委托(delegate)给工厂:

class ComponentFactory
{
private:
SomeComponent1* firstDepOfA;
SomeComponent2* secondDepOfA;
/* other dependencies/constructor parameters */

public:
ComponentFactory(SomeComponent1* firstDepOfA, SomeComponent2* secondDepOfA, ...) :
firstDepOfA(firstDepOfA), secondDepOfA(secondDepOfA), ...
{
}

ComponentA CreateComponentA()
{
return ComponentA(firstDepOfA, secondDepOfA);
}

...
};

class Layer
{
private:
ComponentFactory& componentFactory; // Composition
/* ...and many other components */

public:
Layer(ComponentFactory& componentFactory, ...) :
componentFactory(componentFactory), /* other components */

void DoSomethingThatUsesComponentA()
{
ComponentA = componentFactory.CreateComponentA();
...
}
};

关于c++ - 在初始化列表中初始化许多对象成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23854947/

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