C ++使用依赖于类的类型和函数在所有类实例中具有相同值的变量

时间:2015-10-17 19:36:49

标签: c++ function-pointers

我有一个2D数组的函数指针,它们在类的所有实例(数百万!)中具有相同的值。

class Foo{
    public:

    ...

    ...
    static int bar1(const Foo& foo_1, const Foo& foo_2);
    static int bar2(const Foo& foo_1, const Foo& foo_2);
    static int bar3(const Foo& foo_1, const Foo& foo_2);
    static int bar4(const Foo& foo_1, const Foo& foo_2);

    static int bar4(const Foo& foo_1, const Foo& foo_2);

    friend bool foobar_func(const Foo& foo_1, const Foo& foo_2) {
    ...

我的2D数组类似于:

int (*fcn_pointers[2][2])( const Foo&, const Foo&) = { 
                                                    {&Foo::bar1, &Foo::bar2},
                                                    {&Foo::bar3, &Foo::bar4}
                                                  }

对于我的生活,我无法将此2D数组初始化一次,然后在foobar_func内使用。我遇到了问题,因为类型依赖于它所属的类。

这甚至可能吗?性能非常在这里非常重要 - 我这样做的重点是提高性能(如果它有效的话)。所以添加一个条件来检查它是否被初始化是我无法承受的。

我不熟悉C ++ - 我对C ++的整个体验都是基于查看这个源代码的周末,所以我可能遗漏了一些明显的东西。我对C ++的使用并不需要比这样的问题更深入,所以学习C ++并不是一个优先事项(尽管可能有一些关于它的'陷阱'的链接会有所帮助。我是一名熟悉Java,C和Python的博士生,所以我理解面向对象的编程,而不是如何用C ++解决这个问题。

我试图做这样的事情,但它说链接器找不到Foo::bar1等。

class Foo{
    public:

    static int bar1(const Foo& foo_1, const Foo& foo_2);
    static int bar2(const Foo& foo_1, const Foo& foo_2);

    friend bool foobar_func(const Foo& foo_1, const Foo& foo_2) {
       return false;
    }

};

int (*fcn_pointers[2][2])( const Foo&, const Foo&) = { 
                             {&Foo::bar1, &Foo::bar2},
                             {&Foo::bar1, &Foo::bar2}
                                              };


admin@test:~/test$ g++ -std=c++11 test.cpp
/tmp/ccN4yJ56.o:(.data+0x0): undefined reference to `Foo::bar1(Foo const&, Foo const&)'
/tmp/ccN4yJ56.o:(.data+0x8): undefined reference to `Foo::bar2(Foo const&, Foo const&)'

1 个答案:

答案 0 :(得分:1)

以下是解决问题的一种方法:

class Foo
{
public:
    static int bar1(const Foo& foo_1, const Foo& foo_2);
    static int bar2(const Foo& foo_1, const Foo& foo_2);
    static int bar3(const Foo& foo_1, const Foo& foo_2);
    static int bar4(const Foo& foo_1, const Foo& foo_2);

    typedef int(*fcn_pointers_type)(const Foo&, const Foo&);

    static const fcn_pointers_type funcs[2][2];
};

// put in a source file
const Foo::fcn_pointers_type funcs[2][2] = { { &Foo::bar1, &Foo::bar2 }, { &Foo::bar3, &Foo::bar4 } };