初始化期间的运行时类方法替换

时间:2017-11-08 22:36:08

标签: c++ methods initialization function-pointers member-function-pointers

假设我有一个包含方法speak()的类,它将向终端输出内容。它的打印输出究竟是由初始化布尔值决定的,如果为真,它将打印“Foo”,如果为false,则打印“Bar”。布尔值的值在运行时确定。

实现此功能的一种方法是在if函数中添加speak()语句,然后调用foo()bar()方法。但是,如果频繁调用此类方法,则可以通过ifspeak()替换foo()函数来避免bar()开关和附加函数调用。在初始化阶段起作用。有没有办法使用功能点来实现这个功能?

class MyClass
{
  public:
    MyClass (const bool select)
    {
        if (select)
        {
            // Make speak() use foo();
        }
        else
        {
            // Make speak() use bar();
        }
    }

    speak() const;

  private:
    foo() const { std::cout << "Foo\n"; }
    bar() const { std::cout << "Bar\n"; }
}

这种行为似乎是有益的,因此我认为有一些方法可以实现它。但是,我没有找到如何做到这一点的运气,主要是因为我不确定谷歌是什么。

感谢您的帮助和建议。

2 个答案:

答案 0 :(得分:3)

  

这种行为似乎是有益的,因此我认为有一些方法可以实现它。

是的,可以使用成员函数指针。

  1. 声明一个成员函数指针的成员变量。

      void (MyClass::*speaker)() const;
    
  2. 在构造函数中正确初始化它。

    MyClass (const bool select)
    {
       if (select)
       {
          speaker = &MyClass::foo;
       }
       else
       {
          speaker = &MyClass::bar;
       }
    }
    
  3. speak中使用它。

    void speak() const
    {
       (this->*speaker)();
    }
    
  4. http://en.cppreference.com/w/cpp/language/pointer了解有关成员函数指针的更多信息。

    这是a working example

    #include <iostream>
    
    class MyClass
    {
       public:
    
          MyClass (const bool select)
          {
             if (select)
             {
                speaker = &MyClass::foo;
             }
             else
             {
                speaker = &MyClass::bar;
             }
          }
    
          void speak() const
          {
             (this->*speaker)();
          }
    
          void (MyClass::*speaker)() const;
    
       private:
          void foo() const { std::cout << "Foo\n"; }
          void bar() const { std::cout << "Bar\n"; }
    };
    
    int main()
    {
       MyClass m1(true);
       MyClass m2(false);
    
       m1.speak();
       m2.speak();
    }
    

    及其输出:

    Foo
    Bar
    

答案 1 :(得分:0)

存储传递给构造函数的值并在条件语句中使用它不仅仅是一个问题吗?

class MyClass
{
  private:
    bool mselect;
  public:
    MyClass (const bool select)
    {
       mselect = select;
    }

    void speak()
    {
        if(mselect)
            std::cout << "Foo\n";
        else
            std::cout << "Bar\n";
    }

};

或者我错过了这个问题的某些部分?对不起,会发表评论但还没有声誉。