c++行为树模式和不使用分号或指针引用调用成员

nhn9ugyo  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(175)

我有一个关于行为树模式中的这种类型的实现调用的快速问题。从我所看到的第一行中,他们将指向对象的指针称为"builder",但其后的每一行都省略了对指针对象的调用"builder"。他们还省略了";"分号
a:这是什么类型的模式,在哪里可以找到这样的指针上调用成员的引用

BT::BehaviorTree* Bt=Builder
    ->ActiveSelector()
        ->Sequence()
            ->Condition(BT::EConditionMode::IsSeeEnemy,false)
                 ->Back()       
            ->ActiveSelector()
                 -> Sequence()
                      ->Condition(BT::EConditionMode::IsHealthLow,false)
                           ->Back()
                      ->Action(BT::EActionMode::Runaway)
                            ->Back()
                      ->Back()
                ->Parallel(BT::EPolicy::RequireAll, BT::EPolicy::RequireOne)
                      ->Condition(BT::EConditionMode::IsEnemyDead,true)
                            ->Back()
                      ->Action(BT::EActionMode::Attack)
                            ->Back()
                      ->Back()
               ->Back()
            ->Back()
    ->Action(BT::EActionMode::Patrol)
->End();

类的定义如下所示

class BehaviorTreeBuilder
{
public:
    BehaviorTreeBuilder() { }
    ~BehaviorTreeBuilder() { }
    BehaviorTreeBuilder* Sequence();
    BehaviorTreeBuilder* Action(EActionMode ActionModes);
    BehaviorTreeBuilder* Condition(EConditionMode ConditionMode, bool IsNegation);
    BehaviorTreeBuilder* Selector();
    BehaviorTreeBuilder* Repeat(int RepeatNum);
    BehaviorTreeBuilder* ActiveSelector();
    BehaviorTreeBuilder* Filter();
    BehaviorTreeBuilder* Parallel(EPolicy InSucess, EPolicy InFailure);
    BehaviorTreeBuilder* Monitor(EPolicy InSucess, EPolicy InFailure);
    BehaviorTreeBuilder* Back();
    BehaviorTree* End();
}

我的主要问题是,我理解他们创建了一个对象指针,并向指针添加了方法。
但我不明白的是,当他们调用树构建器时,每一个新行都省略了指针名称,并使用了以下内容

...= Builder 
-> functionA()
-> functionB()
-> functionA()
-> functionC();

这可能是某种lambda表达式或堆栈或队列模式吗?模式名称是什么?我在哪里可以找到它的参考,因为我读过的所有书籍都没有提到这样做。
先谢了!

7gcisfzg

7gcisfzg1#

课程的实施
这不是类实现,这是类定义。
可能的类成员函数实现:

BehaviorTreeBuilder* BehaviorTreeBuilder::Sequence() {
  // Do stuff
  return this;
}

所有的魔力都在return this里。

= Builder 
-> functionA()
-> functionB();

这和

= (Builder 
-> functionA())
-> functionB();

如果一个函数返回一个指针,你可以像处理指针一样处理结果。

相关问题