gpt4 book ai didi

c++ - 选择构造函数的更好模式

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

我有类 Foo,它有多个构造函数。

class Foo
{
public:
Foo( Param1, Param2 );
Foo( Param1, Param3, Param4 );
Foo( Param1, Param4 );
Foo( Param1, Param2, Param4 );
}

构造函数的实际参数列表很大,我不想直接从其他项目提供对这些构造函数的访问(否则我需要导出这 4 个构造函数)。我知道避免此类多个构造函数的最佳模式是 Builder Pattern。但这会给这个类的客户造成混淆,不知道哪个参数是可选的,哪个参数不是。此外每个构造函数都基于参数进行某些验证。因此,在对该对象实际使用任何方法之前,我需要一个共同的地方来进行此类验证。

所以目前我们正在计划如下:

  1. 没有改变 Foo 类。

  2. 定义FooParam结构

    struct FooParam
    {
    Param1 p1;
    Param2 p2;
    Param3 p3;
    Param4 p4;
    }
  3. 工厂:

    Foo* CreateFoo( FooParams& foo )
    {
    if( foo.Param2 )
    {
    if( foo.Param4 )
    {
    return new Foo( foo.param1, foo.param2, foo.param4);
    }
    else
    return new Foo( foo.param1, foo.param2);
    }
    else if( foo.param4 )
    {
    if(foo.param3)
    return new Foo( foo.param1, foo.param3, foo.param4 );
    else
    return new Foo( foo.param1, foo.param4 );
    }

    throw new Exception("Invalid Parameter" );
    }

我认为我们可以在第 3 步做得更好。但现在确定怎么做了吗?

最佳答案

如果您出于某些原因不想公开您的构造函数,您可以轻松地将它们隐藏在基于模板和完美转发的工厂方法后面:

class Foo {
// defined somewhere
Foo( Param1, Param2 );
Foo( Param1, Param3, Param4 );
Foo( Param1, Param4 );
Foo( Param1, Param2, Param4 );

private:
template<typename... Args>
static auto factory(Args&&... args) {
Foo foo{std::forward<Args>(args)...};
// do whatever you want here
return foo;
}
}

不需要在运行时抛出任何东西。
如果不存在接受这些参数的构造函数,您将收到编译时错误。


否则,另一种惯用的方法是使用 named constructors .
我直接从上面的链接中复制并粘贴示例:

class Game {
public:
static Game createSinglePlayerGame() { return Game(0); }
static Game createMultiPlayerGame() { return Game(1); }

protected:
Game (int game_type);
};

不确定这是否符合您的要求。


也就是说,想想这样做有什么好处:

CreateFoo({ Param1V, Param3V });

或者更糟的是,这个:

FooParams params{ Param1V, Param3V };
CreateFoo(params);

取而代之的是:

new Foo{Param1V, Param3V};

通过引入中级类(class),您实际上并没有帮助您类(class)的用户。
他们仍然必须记住特定情况所需的参数是什么。

关于c++ - 选择构造函数的更好模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40687391/

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