代码之家  ›  专栏  ›  技术社区  ›  SmacL

C++中非静态成员作为默认参数

  •  14
  • SmacL  · 技术社区  · 16 年前

    我正在重构大量代码,其中我必须向许多函数添加一个额外的参数,这些函数的值总是该对象的一个成员。差不多

    class MyClass
    {
    public:
       CMyObject A,B;
    
       void MyFunc(CMyObject &Object);
       // used to be void MyFunc();
    };
    

    现在,我真的想把它读出来

    class MyClass
    {
    public:
       CMyObject A,B;
    
       void MyFunc(CMyObject &Object = A);
    };
    

    但我不允许有非静态成员的默认参数。我读过 this similar question 这表明这是不可能的,但我想知道是否有任何合理的解决办法。原因是95%的时间使用默认参数,因此使用默认参数将极大地减少我必须更改的代码量。到目前为止,我最好的解决方案是这样的;

    class MyClass
    {
    public:
       CMyObject A,B;
    
       void MyFunc(BOOL IsA = TRUE);
    };
    
    void MyClass::MyFunc(BOOL IsA)
    {
        CMyObject &Object = A;
        if (!IsA)
            Object = &B;
    }
    

    编辑:

    2 回复  |  直到 9 年前
        1
  •  21
  •   Benoît photo_tom    16 年前

    怎么样:

    class MyClass
    {
    public:
       CMyObject A,B;
    
       void MyFunc()
       { 
         MyFunc(A); 
       }
       void MyFunc(CMyObject &Object);
    };
    

        2
  •  4
  •   MSalters    16 年前

    另一种方式:

    class MyClass
    {
    public:
       MyObject A,B;
    
       void MyFunc(MyObject MyClass::*myObject = &MyClass::A) {
           MyObject& obj = *(this->*myObject);
       }
    };
    

    这使得从另一个MyClass实例传入MyObject成员甚至不可能。调用MyFunc的三个有效选项是 .MyFunc() , .MyFunc(&MyClass::A) .MyFunc(&MyClass::B)

    推荐文章