Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何清理虚拟功能链中的功能参数?_C++ - Fatal编程技术网

C++ 如何清理虚拟功能链中的功能参数?

C++ 如何清理虚拟功能链中的功能参数?,c++,C++,我正试图让我的虚拟功能在最终用户看来更干净。虚拟函数存在的一个问题是,它们强制同一类型的保持链。然而,很多时候这是不可取的。因为它强制用户向上投射指针。所以我在Hello上想出了这个结构。您可以看到,这允许更改最终用户类中的类型。onHi是做这件事的传统方式。我想知道这种方法是否普遍使用,为什么 struct base { virtual void onHello( base& X ) { x_printf( "Hello - setting base" ); } vir

我正试图让我的虚拟功能在最终用户看来更干净。虚拟函数存在的一个问题是,它们强制同一类型的保持链。然而,很多时候这是不可取的。因为它强制用户向上投射指针。所以我在Hello上想出了这个结构。您可以看到,这允许更改最终用户类中的类型。onHi是做这件事的传统方式。我想知道这种方法是否普遍使用,为什么

struct base
{
    virtual void onHello( base& X ) { x_printf( "Hello - setting base" ); }
    virtual void onHi   ( base& X ) { x_printf( "Hi - setting base" ); }
};

template< typename T >
struct base_link : public base
{
    virtual void onHello( base& X ) override { /*do type checking here*/ ((T*)this)->onHello( *(T*)&X ); }
};

struct bar_yes : public base_link<bar_yes>
{
                 bar_yes( int Y ) : Yes( Y ) {}
            void onHello( bar_yes& Y )          { base::onHello( Y ); Yes = Y.Yes; }
    virtual void onHi   ( base&    X ) override { /*do type checking here*/ base::onHi( X ); Yes = ((bar_yes*)&X)->Yes; }

    int Yes;
};

struct bar_no : public base_link<bar_no>
{
                 bar_no ( int N ) : No( N ) {}
            void onHello( bar_no& N )          { base::onHello( N ); No = N.No;  }
    virtual void onHi   ( base&   X ) override { /*do type checking here*/ base::onHi( X ); No = ((bar_no*)&X)->No; }

    int No;
};

void main()
{
    bar_yes     TestYes[2] { 0, 1 };
    bar_no      TestNo[2]  {100,200};
    base*       pBase[]    { &TestYes[0], &TestNo[0] };

    pBase[0]->onHello( TestYes[1] );
    pBase[0]->onHi   ( TestYes[1] );
    pBase[1]->onHello( TestNo[1] );
    pBase[1]->onHi   ( TestNo[1] );
}

永远不需要向上投射指针。什么是固定链?你做的东西叫什么。但在你的例子中,我认为这是一个糟糕的设计,因为它看起来像是你的班级在做别人的工作。尼古拉·孔德拉捷耶夫-谢谢你的评论,我发现它非常有用。这个类除了重定向之外没有做其他的工作,我的意思是你把base&传递给接口方法,所以你想用它做点什么,但是它是不同的对象,它应该自己处理。而且,向下投射指针也是个坏主意。我可能错了,也许你的例子太简单了,在更复杂的情况下,所有这些都是有意义的。但我的另一个猜测是,您需要这样的东西,看一看。在这个示例中,主函数只有指向基类的指针。这是典型的C++和主要的虚拟函数的海豚。如果您想拥有onHi提供的功能,大多数人都会编写与onHi相同的代码。然而,onHello提供了一种替代的、可能更干净的方法来处理与onHi相同的情况。因为onHello已经排除了指针转换,并且可能还排除了其他因素,比如参数断言。在安全方面,我可以说onHello更好,因为它减少了用户的代码。性能方面应该是一样的,谢谢。