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



假设我有一个类,它包含一个方法speak(),该方法将向终端打印一些内容。它将打印出的确切内容由初始化布尔值决定,如果为true,它将打印"Foo",如果为false,它将显示"Bar"。布尔值的值是在运行时确定的。

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

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 << "Foon"; }
bar() const { std::cout << "Barn"; }
}

这种行为似乎是有益的,因此我认为有某种方法可以实现它。然而,我还没有找到如何做到这一点,主要是因为我不确定该用谷歌搜索什么。

谢谢你的帮助和建议。

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

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

  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)();
    }
    

有关成员函数指针的更多信息,请访问http://en.cppreference.com/w/cpp/language/pointer.

下面是一个工作示例:

#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 << "Foon"; }
void bar() const { std::cout << "Barn"; }
};
int main()
{
MyClass m1(true);
MyClass m2(false);
m1.speak();
m2.speak();
}

及其输出:

Foo
Bar

这不仅仅是存储传递给构造函数的值并在speak()中的条件中使用它的问题吗?

class MyClass
{
private:
bool mselect;
public:
MyClass (const bool select)
{
mselect = select;
}
void speak()
{
if(mselect)
std::cout << "Foon";
else
std::cout << "Barn";
}

};

还是我遗漏了这个问题的某些部分?抱歉,我会作为评论发布,但还没有声誉。

相关内容

  • 没有找到相关文章

最新更新