使用依赖于 class 的类型和函数在 class 的所有实例中具有相同值的 C++ 变量
C++ Variable with same value across all instances of class using type and functions dependent on class
我有一个函数指针的二维数组,它在 class 的所有实例(数百万!)中具有相同的值。
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) {
...
我的二维数组是这样的:
int (*fcn_pointers[2][2])( const Foo&, const Foo&) = {
{&Foo::bar1, &Foo::bar2},
{&Foo::bar3, &Foo::bar4}
}
我这辈子都无法让这个二维数组初始化一次,然后在 foobar_func
内部使用。我 运行 遇到问题,因为类型取决于它所属的 class。
这可能吗?性能在这里 非常 重要——我这样做的全部目的是提高性能(如果可行的话,它会的)。所以加一个conditional来检查是否初始化不是我能承受的。
我不熟悉 C++ -- 我对 C++ 的整个体验都是基于一个周末查看此源代码,所以我可能遗漏了一些明显的东西。我对 C++ 的使用不需要比这样的问题更深入,所以学习 C++ 不是优先事项(尽管 link 到一些 'gotchas' 可能会有所帮助_。我是一名博士生,熟悉Java、C 和 Python,所以我理解面向对象编程,只是不知道如何用 C++ 解决这个问题。
我试图做这样的事情,但它说 linker 找不到 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&)'
这是解决问题的一种方法:
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 } };
我有一个函数指针的二维数组,它在 class 的所有实例(数百万!)中具有相同的值。
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) {
...
我的二维数组是这样的:
int (*fcn_pointers[2][2])( const Foo&, const Foo&) = {
{&Foo::bar1, &Foo::bar2},
{&Foo::bar3, &Foo::bar4}
}
我这辈子都无法让这个二维数组初始化一次,然后在 foobar_func
内部使用。我 运行 遇到问题,因为类型取决于它所属的 class。
这可能吗?性能在这里 非常 重要——我这样做的全部目的是提高性能(如果可行的话,它会的)。所以加一个conditional来检查是否初始化不是我能承受的。
我不熟悉 C++ -- 我对 C++ 的整个体验都是基于一个周末查看此源代码,所以我可能遗漏了一些明显的东西。我对 C++ 的使用不需要比这样的问题更深入,所以学习 C++ 不是优先事项(尽管 link 到一些 'gotchas' 可能会有所帮助_。我是一名博士生,熟悉Java、C 和 Python,所以我理解面向对象编程,只是不知道如何用 C++ 解决这个问题。
我试图做这样的事情,但它说 linker 找不到 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&)'
这是解决问题的一种方法:
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 } };