c++ - "Define"类构造函数中的成员函数

标签 c++ c++11 constructor member-functions

大家好,

我想知道您是否能够在类的构造函数中定义或实例化一个函数。

假设您有这个简单的类:

class cTest {
public:
    cTest( bool bla );
    ~cTest() {}

    void someFunc() {}
};

cTest::cTest( bool bla ) {
    if( bla ) {
        someFunc = functionBody1;
        // or
        someFunc {
            functionBody1
        };
        // or something different
    } else
        someFunc = functionBody2;
}

如果 someFunc 是一个经常被调用的函数,您可以避免每次调用该函数时都测试“bla”是否为真。

我想了想,想到了两种可能的解决方案:

1) 使用继承:

#include <iostream>

class iTest {
public:
    virtual void someFunc() = 0;
};

class cTest1 : public iTest {
public:
    void someFunc() { std::cout << "functionBody1\n"; }
};

class cTest2 : public iTest {
public:
    void someFunc() { std::cout << "functionBody2\n"; }
};

2) 使用函数指针:

#include <iostream>

class cTest {
public:
    cTest( bool bla );
    ~cTest() {}

    void someFunc();
private:
    void ( cTest::*m_functionPointer )();

    void function1() { std::cout << "functionBody1\n"; }
    void function2() { std::cout << "functionBody2\n"; }
};

cTest::cTest( bool bla ) {
    if( bla )
        m_functionPointer = &cTest::function1;
    else
        m_functionPointer = &cTest::function2;
};

void cTest::someFunc() {
    ( *this.*m_functionPointer )( );
};

在我需要它的程序中,我不能使用继承,也不想使用函数指针。 所以我的问题是,是否有另一种(优雅的)方法可以做到这一点,例如在类的构造函数中定义函数?

非常感谢您的回答!

最佳答案

如果你不喜欢函数指针,你可以使用函数:

#include <functional>

在类的私有(private)部分,不要定义函数指针,而是定义函数包装器:

private:
    std::function<void()> m_function;

然后您可以使用 lambda 函数在构造函数中动态初始化此函数包装器:

if (bla)
    m_function = [this]() { std::cout << id << "functionBody1\n";   };
else
    m_function = [this]() { std::cout << id << "functionBody2\n";  };

请注意,您应该捕获 [this] 以便能够访问类成员。

并将您的 someFunc() 的定义更改为:

void cTest::someFunc() {
    m_function();
};

性能注意事项:

如果您有性能关键问题,您应该做几个基准测试以确保选择正确的解决方案。在核心 i7 上使用 MSVC2013 的 Release模式下,我得到了 10 000 000 次循环:

15 ms for the function wrapper
31 ms for the function pointer 
16 ms for the traditional if/else in the function body. 

在 Debug模式下(未优化),它看起来分别与 1766、625 和 297 不同。

关于c++ - "Define"类构造函数中的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25389565/

相关文章:

c++ - 如何忽略文件底部的空格?

c++ - Qt5 Designer Ui 文件中的 QSystemTrayIcon

c++ - 由于从 float 自动转换为 double,nan-boxing 的 std::num_put 问题

C++ 类模板构造函数——用数组 (U*) 重载引用 (U&) 失败

c++ - stable_sort 不保持元素的顺序

c++ - 使用 CoInitialize 和 CoUninitialize 引发 C++ 异常

c++ - Lambda 表达式作为类属性?

C++11 lambda 捕获列表 [=] 使用引用

使用公共(public)和私有(private)重载构造函数时的 C++ 垃圾成员值

java - 调用另一个构造函数时有什么方法可以访问 this.toString() 的值吗?