假设我有一个类,它包含一个方法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"; }
}
这种行为似乎是有益的,因此我认为有某种方法可以实现它。然而,我还没有找到如何做到这一点,主要是因为我不确定该用谷歌搜索什么。
谢谢你的帮助和建议。
这种行为似乎是有益的,因此我认为有某种方法可以实现它。
是的,可以使用成员函数指针。
-
声明作为成员函数指针的成员变量。
void (MyClass::*speaker)() const;
-
在构造函数中适当地初始化它。
MyClass (const bool select) { if (select) { speaker = &MyClass::foo; } else { speaker = &MyClass::bar; } }
-
在
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";
}
};
还是我遗漏了这个问题的某些部分?抱歉,我会作为评论发布,但还没有声誉。